2007年02月20日
getter/setter のアクセス制御指定子は同じでなければいけない?(1)‐AS で自己カプセル化
次のコードはコンパイルできる。
package { import flash.display.Sprite; public class Test extends Sprite { private var _sample:String; public function get sample():String { return _sample; } public function set sample(v:String):void { _sample = v; } public function Test() { sample = "hoge"; } } }
でも、setter を private にした瞬間…
private function set sample(v:String):void
エラーになる。
>mxmlc Test.as 設定ファイル "C:\flex\frameworks\flex-config.xml" をロードしています N:\program\as\Test.as(20): col: 4 エラー: sample への参照があいまいです。 sample = "hoge"; ^
参照が曖昧ってなぜ? よく分からん。 (2007.2.28追記、理由が分かりました。詳しくは getter/setter のアクセス制御指定子は同じでなければいけない? (2) - 解決編 参照。)
クラス内部のみ setter を使えるようにはできないんだろうか。もちろん、_sample を直接いじればいいんだけど、_sample という変数が存在すること自体、クラス全体に秘密にしたいこともある。
これをリファクタリング業界では 自己カプセル化 というらしい。自己カプセル化を行う上で、setter だけを private にしたい、という要望は往々にしてでるはずなんだろうけど、ActionScript3 では無理なようだ。
setter の中で argument.caller から呼び出し元のクラス内を取得すればいけるかな、と思ったら、AS3 では argument.caller が定義されていないし。ううむ。
もちろん、private function setSample(s:String):void というメソッドを作ったら、やりたいことは満たされるんだけど、あんまりきれいじゃない。