ダイナミッククラス
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で公開中です。