[AS]getter/setterの明示型と暗黙型について
getter/setterの存在意義としては、オブジェクト指向における
「パブリックなプロパティを使わない」
という概念からあるっぽい。
ということは、プライベートなプロパティへのアクセス方法としてgetter/setter(アクセサメソッド)という概念があるということかな。
明示型のアクセサメソッドについて
パブリックな関数を用意してその戻り値にプライベートなプロパティを設定する。
こんな感じ。
package { public class NewClass { private _number:Number = 10; public function getNumber():Number{ return _number; } public function setNumber(num:Number):void{ _number = num; } } }
こんな感じで呼び出す。
//フレームアクションとかで var newClass:NewClass = new NewClass(); newClass.setNumber(200); trace(newClass.getNumber) //出力:200
で、暗黙型のアクセサメソッドについて
いわゆる、よく参考書に書かれているアクセサメソッドを使った方法。
こんな感じ
package { public class NewClass { private var _number:Number = 10; public function get number():Number { return _number; } public function set number(value:Number):void { _number = value; } } }
こんな感じで呼び出す
//フレームアクションとかで var newClass:NewClass = new NewClass(); newClass.number = 200; trace(newClass.number) //出力:200
二つの違いは、通常通り関数としてアクセスするか、横着してプロパティっぽく使いたいかってことなのかな。
使い勝手として、元来、関数的な処理なので、例外処理とかを追加して使うのが王道っぽい。
たとえば、_numberには正の数値のみという条件があった場合は、
明示的な例
package { public class NewClass { private var _number:Number = 10; public function getNumber():Number{ return _number; } public function setNumber(num:Number):void{ if (num < 0) { _number = 0; } else{ _number = num; } } } }
getter/setterがプロパティもどきと、考えてたから色々こんがらがってた。
けれど元来は関数でやってたことをプロパティっぽく使える便利機能だよって感じだということを知って、ちょっと納得。
Tweet