- 2008年9月 6日 00:26
- ActionScript 3.0
set/getを使ってアクセス制御する
本来、オブジェクト指向の考え方ではなるべくprivateキーワードを使って外部からのアクセスを遮断し、クラスに対し自律責任的に行動するようにします。
しかしやむを得ず外部からのアクセスを許す場合は、最低限の安全を確保したいものです。
安易にpublicにすれば、外部からの直接的なアクセスをすべて許すことになり、バグなどの危険も増す可能性があります。かといって、protected(定義クラスとサブクラスのみアクセス可)やinternal(定義クラスと同一パッケージでのみ可)では範囲がせますぎます。
ビルドインクラスのインスタンスプロパティには、読み取り専用・書き込み専用があります。これらのプロパティは、制限がかかっているため、たとえば読み取り専用の場合は書き込みができず、参照しか行えません。 このようにアクセス制御ができればよいのですが、ではどうすればいいのでしょうか?
getを使って読み取り専用にする
これをカスタムクラスで実現したい場合getterとsetterを使用します。
これらのキーワードを用いれば、インスタンスプロパティを暗にプロパティのように()なしで参照・書き込みが行えるメソッドとして取り扱うことができます。
getは参照、setは書き込み用に使います。
以下は、外部読み込み専用のプロパティを示した例です。
package {
public class Tom {
private var _age:int = 15
public function get age():int { return _age; }
}
}
まず、実プロパティ_ageをprivateとすることにより、外部からのアクセスを遮断します。次にpublic function get ageを定義しています。getキーワードを、functionの次に示すことで、getterであることを宣言します。 getterは参照用なので、値を返す必要があります。返り値の型指定を行い、returnステートメントでprivate _ageを返します。
これでgetterの設定は完了しました。
ここで注意していただきたいのは、setterは定義しないことです。
外部から_ageにアクセスしたい場合は、以下のように記述できます。
package {
import flash.display.MovieClip;
public class Test extends MovieClip {
public function Test():void {
var tom:Tom = new Tom();
trace(tom.age)//出力15
tom.age = 17//コンパイルエラー:1059: プロパティは読み取り専用です。
}
}
}
書き込もうとするとコンパイルエラーが発生する点です。そうです。getterを定義し、setterを定義しないことで、読み取り専用が実現してしまいした。
setで書き込みを許可する
setterを設定する場合はクラスTomにsetを宣言することで、外部からage = 17のように設定することができるようになります。
public function set age(value:int):void {
_age = value;
}
これらの実体はメソッドなので、たとえば値をセットした瞬間になんらかの命令を行うこともできます。



