ダイナミッククラス
AS3のObjectには任意の属性を追加することができます。また、存在しない属性名を指定してもコンパイルエラーにはなりません。AS3では、Object以外にも、クラス宣言にdynamicキーワードが付いているクラスは、同じ使い方をすることができます。
// Objectの場合
var foo:Object = new Object();
foo.x = 5;
// dynamicキーワード付きでクラスを宣言
public dynamic class Bar {}
var bar:Bar = new Bar();
// 下は正常に実行される
bar.x = 5;
上のサンプルで、Barクラスには何も属性が定義されていません。しかし、xという属性に値を設定するコードが、正常にコンパイルされ、実行されます。これは、xという属性が動的に作成されたからです。もしくは、Barが"x"をキーとして持つMapとして機能すると理解することもできます。
このように、dynamic付きで宣言されたクラスをダイナミッククラスと呼びます。ダイナミッククラスは、属性やメソッドを実行時に追加したり変更したりできる、変更可能なオブジェクトです。
ダイナミッククラスのインスタンスに実行時に追加する属性は、実行時のみの存在です。これらの属性の型チェックはコンパイル時には行われません。また、この方法で追加する属性に型注釈を付けることはできません。
public dynamic class Bar {}
var bar:Bar = new Bar();
bar.x = 10;
bar.y = "foo";
trace(bar.x, bar.y);
// 10 fooが出力される
dynamicキーワード付きで宣言されたクラスでは、プライベートな属性にアクセスできません。ドット演算子(.)を使用してアクセスすると、コンパイルエラーが発生します。属性名による参照では、コンパイルエラーにはなりませんが(ランタイムエラーにもなりません)、属性が参照不可のため、undefinedが値として返されます。下の例では、ダイナミッククラスであるBarクラスのprivate属性を参照しようとしています。
public dynamic class Foo
{
private var bar:String = "プライベートな属性";
}
var foo:Foo = new Foo();
trace(foo["bar"]);
// undefinedが出力される
trace(foo.bar);
// コンパイルエラーになる
ダイナミッククラスの詳細はオンラインヘルプのダイナミッククラスをご覧ください。
この記事の続き『JavaとActionScript 3 の違い:振舞い編』は、Adobe Developer Connectionで公開中です。


