クラスとスコープについて

ActionScript コードをクラスに移植するとき、場合によっては this キーワードの使い方を変更する必要があります。たとえば、コールバック関数を使用するクラスメソッド (LoadVars クラスの onLoad() メソッドなど) では、this キーワードがクラスを指すのか LoadVars オブジェクトを指すのか判断しにくいことがあります。その場合は、次の例のようにして現在のクラスへのポインタを作成します。

スコープと外部クラスファイルを理解するには :

  1. [ファイル]-[新規] を選択し、[ActionScript ファイル] を選択して、[OK] をクリックします。
  2. 次のコードをスクリプトウィンドウに入力またはコピーします。
    /**
        Product クラス
        "Product.as"
    */
    class Product {
      private var productsXml:XML;
      // コンストラクタ
      // targetXmlStr - ストリング。XML ファイルへのパスを含む
      function Product(targetXmlStr:String) {
        /* 現在のクラスへのローカル参照を作成する。 
           XML の onLoad イベントハンドラ内を実行している場合でも、 
           XML パケットだけでなく、現在のクラスも参照できる。
        */
        var thisObj:Product = this;
        // ローカル変数を作成する。これは XML のロードに使用する。
        var prodXml:XML = new XML();
        prodXml.ignoreWhite = true;
        prodXml.onLoad = function(success:Boolean) {
          if (success) {
            /* XML を適切にロードおよび解析できた場合は、 
               クラスの productsXml 変数に、解析した 
               XML ドキュメントを設定し、init 関数を呼び出す。
            */
            thisObj.productsXml = this;
            thisObj.init();
          } else {
            /* XML ファイルのロードでエラーが発生した。 */
            trace("error loading XML");
          }
        };
        // XML ドキュメントのロードを開始する。
        prodXml.load(targetXmlStr);
      }
      public function init():Void {
        // XML パケットを表示する。
        trace(this.productsXml);
      }
    }
    

    this キーワードは、onLoad ハンドラ内のプライベートメンバー変数を参照することになるので、Product クラスではなく、実際には prodXml インスタンスを表します。このため、onLoad ハンドラからクラスを直接参照するには、このようにローカルクラスファイルへのポインタを作成する必要があります。以上で、このクラスを Flash ドキュメントで使用する準備が整います。

  3. 上記の ActionScript コードを Product.as という名前で保存します。
  4. 同じディレクトリに、testProduct.fla という名前の新規 Flash ドキュメントを作成します。
  5. メインタイムラインのフレーム 1 を選択します。
  6. 次の ActionScript を [アクション] パネルに入力します。
    var myProduct:Product = new Product("http://www.helpexamples.com/crossdomain.xml");
    
  7. [制御]-[ムービープレビュー] を選択して、このコードをテスト環境でテストします。

    指定した XML ドキュメントのコンテンツが [出力] パネルに表示されます。

これらのクラスを使用する際に関係する他の種類のスコープとしては、静的変数と静的関数があります。static キーワードは、変数または関数を、クラスの各インスタンスに対して作成するのではなく、クラスに対して 1 回だけ作成するよう指定します。クラスのインスタンスを作成せずに静的クラスメンバーにアクセスするには、シンタックス someClassName.username を使用します。静的変数と静的関数の詳細については、パブリック、プライベート、および静的なメソッドとプロパティ (メンバー) についておよびクラスメンバーの使用を参照してください。

静的変数のもう 1 つの利点は、静的変数のスコープが終了しても、その値が失われないことです。次の例では、static キーワードを使用して、Flash で作成したクラスのインスタンス数を追跡するカウンタを作成する方法を示します。numInstances 変数は静的なので、単独の各インスタンスに対して作成されるのではなく、クラス全体に対して 1 回だけ作成されます。

static キーワードを使用するには :

  1. [ファイル]-[新規] を選択し、[ActionScript ファイル] を選択して、[OK] をクリックします。
  2. 次のコードをスクリプトウィンドウに入力します。
    class User {
      private static var numInstances:Number = 0;
      public function User() {
        User.numInstances++;
      }
      public static function get instances():Number {
        return User.numInstances;
      }
    }
    

    上記のコードでは、コンストラクタを呼び出した回数を追跡する User クラスを定義しています。プライベートな静的変数 (User.numInstances) は、コンストラクタメソッド内でインクリメントされます。

  3. ドキュメントを User.as という名前で保存します。
  4. [ファイル]-[新規] を選択し、[Flash ドキュメント] を選択して新しい FLA を作成し、この FLA ファイルを "User.as" と同じディレクトリに保存します。
  5. 次の ActionScript コードをタイムラインのフレーム 1 に入力します。
    trace(User.instances); // 0
    var user1:User = new User();
    trace(User.instances); // 1
    var user2:User = new User();
    trace(User.instances); // 2
    

    コードの第 1 行では、静的 instances() getter メソッドを呼び出します。このメソッドはプライベート静的 numInstances 変数の値を返します。コードの残りの部分では、User クラスの新規インスタンスを作成し、instances() getter メソッドから返された現在値を表示します。

  6. [制御]-[ムービープレビュー] を選択してドキュメントをテストします。

クラス内での this キーワードの使用方法については、クラスでの this キーワードの使用についてを参照してください。


 

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

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