ダイナミッククラス

"ダイナミック" クラスは、プロパティおよびメソッドを追加したり変更したりすることで実行時に変更可能なオブジェクトを定義します。String クラスなどの動的ではないクラスは、"sealed" クラスです。実行時に、sealed クラスにプロパティまたはメソッドを追加することはできません。

ダイナミッククラスを作成するには、クラスを宣言するときに dynamic 属性を使用します。たとえば、次のコードは Protean という名前のダイナミッククラスを作成します。

dynamic class Protean
{
    private var privateGreeting:String = "hi";
    public var publicGreeting:String = "hello";
    function Protean()
    {
        trace("Protean instance created");
    }
}

引き続き Protean クラスのインスタンスをインスタンス化する場合、クラス定義外のインスタンスにプロパティまたはメソッドを追加することができます。たとえば、次のコードは、Protean クラスのインスタンスを作成し、プロパティ aString とプロパティ aNumber をそのインスタンスに追加します。

var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
trace(myProtean.aString, myProtean.aNumber); // テスト 3

ダイナミッククラスのインスタンスに追加したプロパティは、実行時エンティティです。したがって、型チェックは実行時に行われます。この方法で追加されたプロパティに型注釈を追加することはできません。

また、myProtean インスタンスにメソッドを追加するには、関数を定義し、その関数を myProtean インスタンスのプロパティに関連付けます。次のコードは、trace ステートメントを traceProtean() というメソッドに移動します。

var myProtean:Protean = new Protean();
myProtean.aString = "testing";
myProtean.aNumber = 3;
myProtean.traceProtean = function ()
{
    trace(this.aString, this.aNumber);
};
myProtean.traceProtean(); // テスト 3

しかし、この方法で作成されたメソッドは、Protean クラスのプライベートプロパティまたはメソッドにアクセスできません。また、Protean クラスのパブリックプロパティまたはメソッドへの参照も、this キーワードまたはクラス名のいずれかで修飾する必要があります。次の例は、Protean クラスのプライベート変数およびパブリック変数にアクセスしようとする traceProtean() メソッドを示します。

myProtean.traceProtean = function ()
{
    trace(myProtean.privateGreeting); // undefined
    trace(myProtean.publicGreeting); // hello
};
myProtean.traceProtean();

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000046.html