kagamihogeの日記

kagamihogeの日記です。

ActionScript の名前空間で多態的な振る舞い

名前空間てのは、大雑把にいえばスコープを司るもので、Java で言うところの package の機構になる。だけど、AS の名前空間Java のパッケージ機構とはちょっと異質なところが幾つかある。その一つとして、ActionScript では名前空間を変数として持つことができる。その名前空間の応用例の一つとして、コレを利用することで多態的な振る舞いを実装できる。

以下サンプルのソース。あいさつの文面を表示するモノで、日本語か英語かで文面を切り替える、だけど呼び出すメソッドは同じ、というものを考える。


まず、名前空間そのものを定義するファイルを用意する。

一つ目が greeting.japanese.as ファイル。

package greeting {
    public namespace japanese="http://d.hatena.ne.jp/kagamihoge/as3greeting/ja"
}

二つ目が greeting.english.as ファイル。

package greeting {
    public namespace english="http://d.hatena.ne.jp/kagamihoge/as3greeting/en"
}

名前空間の URL は……まぁテキトーで。安直に ja と en としときます。

んで、ロケールを表現する文字列を受け取って、それぞれに対応する名前空間を取得して、その名前空間の下にあるメソッドを呼ぶのが下記のクラス。

package greeting
{
    import mx.controls.Alert;
    
    public class GreeingMessage {
        private const country:Object = {"ja":japanese, "en":english};
        
        public function show(code:String):void {
            if (country.hasOwnProperty(code)) {
                var countryNamespage:Namespace = country[code]; 
                trace(this.countryNamespage::getMessage());
            }
        }
        
        japanese function getMessage():String {
            return "こんにちは";
        }
        
        english function getMessage():String {
            return "hello";
        } 
    }
}

getMessage って同名のメソッドが二つあるけど、名前空間のおかげでベツモノとして認識されてるのがミソですかね。んで、名前空間の指定を変えると各々のメソッド(japanese の getMessage か english の getMessage)が呼ばれる。

最後にオマケで使う側のコードはこんな感じ。

var g:GreeingMessage = new GreeingMessage();

g.show("ja"); // こんにちは と表示
g.show("en"); // hello と表示