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 というメソッドを作ったら、やりたいことは満たされるんだけど、あんまりきれいじゃない。