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のみ指定可能。