JavaerのためのAS3(その3:クラス)

クラス定義

  • クラス定義に private/protected 修飾子は無い。publicかpackage privateのみ選択可。
  • abstractクラスというものも存在しない。
  • dynamicという、Java脳では理解しがたいクラスがある。個人的には、出来れば使わない方針にしたい。が、全く使わずに書き切ることができるのか未知数。必要そうだったら、ATDK。

フィールド

ぱっと見、邪道に見えるかもしれないが、フィールドは基本的に public で宣言し、アクセサ(set/getキーワードを使うものや、JavaBeans仕様のようなメソッド)は作らないでおく。その上で、外からはダイレクトにフィールドアクセスを行う。

declaration

class Foo {
  public var bar:int;
}

reference

foo.bar = 1;

この方針でコーディングを進め、アクセサに責務が必要になった時点で、フィールドをprivate化し、名の先頭にアンスコ(_)を加えた上で、アクセサを定義する。

declaration

class Foo {
  private var _bar:int;
  public function set bar(value:int):void {
    // 値チェック等、周辺処理
    _bar = value;
  }
}

reference

foo.bar = 1;

このようにすれば、reference側に影響を与えずに責務を追加することができる。

メソッド

Java

public void foo(String bar) {
  // do something
}

AS3

public function foo(bar:String):void {
  // do something
}

ちなみに、Javaと違い、AS3にはオーバーロードが無い! まぁ、頑張って微妙に違う名前のメソッドを作るしかあるまい。

引数のデフォルト値指定

AS3 decleration

public function foo(bar:String, baz:int = 0, qux:Number = 1.5):void {
  // do something
}

reference

foo("hoge");
foo("fuga", 2);
foo("piyo", 5, 1.2);
メソッドクロージャ
public class Foo {
  public function foo():void {
    trace("hoge");
  }
}
...
var myFunc:Function = new Foo().foo;
myFunc(); // hoge

コンストラク

Java

public Foo() {
  // do something
}

AS3

public function Foo() {
  // do something
}

そしてやはり、Javaと違い、AS3にはオーバーロードが無い訳です。メソッドはまだ良かったんだけど…、コンストラクタにオーバーロードが無いってのは、対処に困りませんか、Java脳の方々。俺もすっごい痛い。なんか良い考え方があったら教えてください。

コンストラクタを定義する際は、とりあえずデフォルトコンストラクタにするか、引数を持つ場合は全ての引数にデフォルト値を指定する。そして、newした後はひたすらsetterを回し、最後に何か必要であったらinitメソッドでも呼ぶ。という対処しかないのかなぁ。ダサい。。

引数のデフォルト値指定

メソッドと同様。

コンストラクタのアクセス制御

publicのみ指定可能。