get と set は特別な関数を定義するために予約されている名前です。オブジェクトのカプセル化のため属性に直接アクセスする代わりに関数を定義したい、という人のための機能です。 他の言語では getXXX() とか setXXX() とかいう関数を定義したりすると思いますが、ActionScript では少し流儀が異なります。
下が、get 関数と set 関数それぞれを定義しているサンプルです。
class AccessFuncs { // private のプロパティを宣言 private var privateProp:String; // get 関数を定義 public function get publicProp():String { return privateProp; } // set 関数を定義 public function set publicProp(val:String):Void { privateProp = val; } }
サンプルコード内で public な get および set の2つの関数を定義する際、get/set それぞれの後にスペースをはさんで、ある名前 (ここでは publicProp) を指定しています。 そして、get 関数では private なプロパティである privateProp の値を返し、set 関数では逆に渡された値を privateProp に代入しています。
さて、このような宣言をすると、以下のような使い方ができるようになります。
var myAccess:AccessFuncs = new AccessFuncs(): myAccess.publicProp = "hello"; var msg = myAccess.publicProp; trace(msg); // hello が出力される
上記のコード内で publicProp が属性のように扱われているのが分かると思います。実際には、2行目で "hello" を publicProp に代入する際には publicProp に対する set 関数が呼ばれ privateProp に値が格納されています。そして、3行目で publicProp を参照する際には同様に get 関数が呼ばれ privateProp の値が返されています。しかし、クラスの利用者は publicProp という属性があるかのようにコードを書くことができます。
これだと、とりあえず属性を定義しておいて後からアクセッサを定義すればいいや、というずぼらなこともできそうですが、(そんな人はいませんよね...)アクセッサとして使われる名前と実体である属性の名前は別にする必要があるので、結局クラス内部のコードの書き直しが発生しそうです。
get と set はどちらかだけでも構いません。その場合、参照専用または 更新専用のプロパティとして属性を公開することとなります。
コメントする