ダイナミッククラスの作成

デフォルトでは、クラスのプロパティとメソッドは固定です。つまり、クラスのインスタンスが、そのクラス内で宣言または定義されているプロパティやメソッド以外のものを作成したり、アクセスしたりすることはできません。たとえば、userNameage の 2 つのプロパティを持つ Person クラスを考えます。

非ダイナミッククラスを作成するには :

  1. [ファイル]-[新規] を選択し、[ActionScript ファイル] を選択して、[OK] をクリックします。
  2. 次の ActionScript をスクリプトウィンドウに入力します。
    class Person {
        public var userName:String;
        public var age:Number;
    }
    

    別のスクリプト内でこの Person クラスのインスタンスを作成し、このクラスの存在しないプロパティにアクセスしようとすると、コンパイルエラーになります。

  3. ファイルを Person.as という名前でハードディスクに保存します。
  4. 新しい FLA ファイルを作成するために [ファイル]-[新規] を選択し、[Flash ドキュメント] を選択して、[OK] をクリックします。
  5. [ファイル]-[名前を付けて保存] を選択し、ファイルに person_test.fla という名前を付けて、前に作成した Person クラスと同じディレクトリに保存します。
  6. 次のコードを追加して、Person クラスの新しいインスタンス (firstPerson) を作成し、Person クラスに存在しない hairColor というプロパティに値を代入します。
    var firstPerson:Person = new Person();
    firstPerson.hairColor = "blue"; // エラー。"hairColor" という名前のプロパティはありません。
    
  7. Flash ドキュメントを保存します。
  8. [制御]-[ムービープレビュー] を選択してコードをテストします。

    Person クラスは hairColor という名前のプロパティを宣言していないので、このコードはコンパイルエラーになります。ほとんどの場合、これは期待どおりの動作であるはずです。コンパイルエラーというと悪いことのように思えますが、プログラマにとっては非常に有益な情報です。エラーメッセージによってコード作成時のミスが早めに指摘されるので、正確なコードを効率よく作成することができます。

場合によっては、オリジナルのクラス定義に含まれていないプロパティやメソッドを実行時に追加して、アクセスする必要が生じる場合があります。その場合に使用するのが dynamic クラス修飾子です。

ダイナミッククラスを作成するには :

  1. [ファイル]-[新規] を選択し、[ActionScript ファイル] を選択して、[OK] をクリックします。
  2. [ファイル]-[名前を付けて保存] を選択し、ファイルを Person2.as という名前で保存します。ファイルをハードディスクに保存します。
  3. 次のコードをスクリプトウィンドウに入力します。
    dynamic class Person2 {
        public var userName:String;
        public var age:Number;
    }
    

    この ActionScript では、dynamic キーワードを前述の例の Person クラスに追加します。Person2 クラスのインスタンスでは、このクラスで定義されていないメソッドやプロパティを追加しアクセスすることができます。

  4. 変更内容を ActionScript ファイルに保存します。
  5. 新しい FLA ファイルを作成するために [ファイル]-[新規] を選択し、[Flash ドキュメント] を選択して、[OK] をクリックします。
  6. [ファイル]-[名前を付けて保存] を選択し、ファイルを person2_test.fla という名前で保存します。保存場所は、"Person2.as" と同じディレクトリにします。
  7. 次のコードを追加して、Person2 クラスの新しいインスタンス (firstPerson) を作成し、Person2 クラスに存在しない hairColor というプロパティに値を代入します。
    var firstPerson:Person2 = new Person2();
    firstPerson.hairColor = "blue";
    trace(firstPerson.hairColor); // 青
    
  8. 変更内容を "person2_test.fla" ファイルに保存します。
  9. [制御]-[ムービープレビュー] を選択してコードをテストします。

    このカスタム Flash クラスはダイナミックなので、実行時にメソッドとプロパティをクラスに追加することができます (SWF ファイルの再生時)。コードをテストすると、テキスト blue が [出力] パネルに表示されます。

アプリケーションを開発するときは、必要でない限り、クラスはダイナミックにしないでください。ダイナミッククラスを使用しない理由の 1 つとして、クラス定義内およびクラスインスタンス内部でアクセスされるメンバーは、クラススコープ内のメンバーと比較されないので、ダイナミッククラスに対する型チェックは、非ダイナミッククラスの場合よりも寛容になる点があげられます。ただし、その場合でも、クラスメンバー関数の戻り値とパラメータの型に対しては、型チェックが実行されます。

ダイナミッククラスのサブクラスもダイナミックになりますが、例外が 1 つあります。MovieClip クラス自体はダイナミックですが、MovieClip クラスのサブクラスはデフォルトではダイナミックになりません。この実装により、MovieClip クラスのサブクラスをダイナミックにするかどうかを選択できるようになっているので、サブクラスをより柔軟に制御できます。

class A extends MovieClip {}        // A は非ダイナミック
dynamic class B extends A {}        // B はダイナミック
class C extends B {}                // C はダイナミック
class D extends A {}                // D は非ダイナミック
dynamic class E extends MovieClip{} // E はダイナミック

サブクラス化の詳細については、継承を参照してください。


 

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

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