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側に影響を与えずに責務を追加することができる。
メソッド
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
コンストラクタ
public Foo() { // do something }
AS3
public function Foo() { // do something }
そしてやはり、Javaと違い、AS3にはオーバーロードが無い訳です。メソッドはまだ良かったんだけど…、コンストラクタにオーバーロードが無いってのは、対処に困りませんか、Java脳の方々。俺もすっごい痛い。なんか良い考え方があったら教えてください。
コンストラクタを定義する際は、とりあえずデフォルトコンストラクタにするか、引数を持つ場合は全ての引数にデフォルト値を指定する。そして、newした後はひたすらsetterを回し、最後に何か必要であったらinitメソッドでも呼ぶ。という対処しかないのかなぁ。ダサい。。
引数のデフォルト値指定
メソッドと同様。
コンストラクタのアクセス制御
publicのみ指定可能。