2009年12月19日土曜日

Java 使いの人向け ActionScript3 のクラス仕様まとめ

仕事の都合でJavaからActionScript3(FlexじゃなくてFlash 10みたいです)に乗り換えることになったので、クラスの仕様に親しむためまとめを作ってみました。


■参考文献
http://www.tom.sfc.keio.ac.jp/~fjedi/wiki/index.php?%A5%AF%A5%E9%A5%B9%BC%FE%A4%EA%A4%CE%BB%C5%CD%CD%28ActionScript3%29
こちらのWikiに完璧にまとまっていますので、ぶっちゃけこのWikiを見ればすべて解決すると思います。


■大原則
迷ったらJavaと同じ。
以下のJavaと違う点に掲載のない事項はすべてJavaと同じ。多重継承が無くてinterfaceが用意されている点など。


■Javaと違う点
  1. package宣言は.NETやC++のように{}で囲む必要がある。{}で囲んだ中はJavaとほぼ同じ。publicクラスが一つしか持てない等。
    package {
        //以下javaと同じ
        import flash.text.TextField;
        public class Hogehoge extends TextField { /*...*/ }
    }
  2. package{}の外側にファイルローカルな関数や変数やクラスを宣言できる。この領域はpackage{}の内側でインポートしたクラスやメソッドが使えない。別途インポートし直す必要がある。
    package {
        import flash.text.TextField;
        public class Hogehoge extends TextField { /*...*/ }
    }
    // 別途インポートが必要
    import flash.text.TextField;
    var abesi:TextField = new TextField();
  3. dynamicクラスがある。
  4. abstractクラスやabstractメソッドが無い。
  5. その他、native, synchronized, transientなどが無い。
  6. namespaceがある。(が、正直使い道がよく分からない)
  7. enum型はない。
  8. コンストラクタにもfunctionを付ける必要がある。
  9. コンストラクタは必ずpublicになる。アクセス制御修飾子を指定しないとpublicとして扱われる。
  10. オーバーロードが一切使用できない。コンストラクタもオーバーロードできない。
  11. オーバーライドの際には必ずoverride修飾子を付ける必要がある。
  12. プロパティのgetter/setterを作るために特別な仕様がある(get修飾子, set修飾子)

その他、クラス以外の違いとして、
  1. String型が参照渡しではなく値渡し(プリミティブ扱いなので)
  2. 関数の引数にデフォルト引数が利用できる(オーバーロードの代わりに使う)
    function abesi(a:String="abesi", b:String="hidebu") { /*...*/ }
    abesi(); //自動的にデフォルト引数が使用されるのでこういう呼び出しが可能
  3. 関数の可変長引数の指定の仕方が異なる
    //Javaでは
    public void abesi(String... args) { /*...*/ }
    //AS3では
    public function abesi(...args) { /*...*/ }


■サンプル
以上を踏まえて、練習がてらにプレイスホルダー付きテキストフィールドクラスを作ってみました。

Javaではコンストラクタのオーバーロードが必要になったところ、AS3ではデフォルト引数のおかげですっきり書けました。やっぱりデフォルト引数はいいですね。あと試しにtextColorプロパティのsetterをオーバーライドしてみたのですが、そのせいでthis.textColor = 0x999999とすると意図しないタイミングでdefaultTextColorが書き換わってしまいはまりました。super.textColorとしてスーパークラスのsetterを呼びだすようにして回避。getter/setterのオーバーライドは強力ですが上手く使わないと混乱を招く諸刃の剣になりそうです。