2012-01-20 28 views
0

私はこのようなクラスグーを持っている:ActionScript 3のサブクラスメソッドの継承問題

public class Goo extends Node 
{ 
    public function Update(dt:Number):void 
    { 
     // function to be overriden 
     trace("updating Goo"); 
    } 
} 

とグーのサブクラスはGooXと呼ばれる:

public class GooX extends Goo 
{ 
    override public function Update(dt:Number):void 
    { 
     trace("updating GooX"); 
    } 
} 

とGooYと呼ばれる別:

public class GooY extends Goo 
{ 
    override public function Update(dt:Number):void 
    { 
     trace("updating GooY"); 
    } 
} 

、次にGooオブジェクトを作成して次のように更新するマネージャ:

public class Manager 
{ 
    private var gooArray:Vector.<Goo> = new Vector.<Goo>(); 

    public function Manager():void 
    { 
     var aGoo:Goo; 
     if (Math.random() >= 0.5) 
     { 
      aGoo = new GooX(); 
     } 
     else 
     { 
      aGoo = new GooY(); 
     } 
     gooArray.push(aGoo); 
    } 

    public function Update(dt:Number):void 
    { 
     for (var i:int = 0; i < gooArray.length; i++) 
     { 
      gooArray[i].Update(dt); 
     } 
    } 
} 

このコードでは、トレースログに常に「Gooの更新」が表示されます。 gooArray[i] is GooXまたはgooArray[i] is GooYを使ってどのタイプのものであるかを検出しようとしましたが、両方とも常にfalseです。私がgooArray[i] as GooXでキャストを強制したとしても、常にと言うと、オブジェクトはnullとなります。

誰も私がやろうとしていることをやっていることを知っていますか?(親クラスの代わりに子クラスの更新を呼び出させる)ありがとう。

+0

あなたがここに投稿したコードをちょうど入れておくと、ほぼ同じ結果が得られません。オーバーライドされたメソッドは私のために呼び出されるので、あなたは何か他のことが起こっていると思います。 –

+0

クラスは私のためにうまく動作します。 Flash Player 11.0.1.152は、Flex 4.1 SDKでFlashBuilderでコンパイルされています。取得する出力は「GooXを更新する」です。私がENTER_FRAMEループにそれを接続すると、私はGooXとGooYの間にかなり均等に分散します。 – meddlingwithfire

+0

これは変だけど、Flex SDK 4.1とFlash Player 11でFlash Builder 4.6を使用しています。動作しません。 – jglievano

答えて

2

あなたは論理的にActionscript3に正しい例ですが、いずれかのタイプのランダムオブジェクトを作成するので、マネージャのコンストラクタで混乱が起こる可能性があります。より良い問題をテストするには、とマネージャーのコンストラクタを置き換えます

public function Manager():void 
{ 
    gooArray.push(new GooY()); 
    gooArray.push(new GooX()); 
} 

この問題は、使用しているコンパイラで奇妙なバグがあるかもしれません。最新のSDKにアップグレードし、クリーンなプロジェクトを行い、同じ問題がまだ発生していないかどうかを確認してください。

最後に、この「ノード」オブジェクトは何ですか?おそらく、非常にありそうもない考えとして、Nodeは、メソッド・コールをハイジャックするオブジェクト・プロキシの一種です。しかし、私はあなたのプロジェクトにこれが当てはまるとは思っていません。

+0

ありがとうございます、あなたは正しいです、その例は論理的に正しいものであり、それ自体が正しく機能しています。私は問題を発見したかもしれないと思う。もちろん、サンプルコードはより幅広いプロジェクトに属しています。私が何か不足していた場合に備えて関連部分を抽象化していました(私はAS3の専門家ではありません)。問題は、サブクラス化されたGooオブジェクトをクローンしてGooオブジェクトに戻すことでした。なぜ抽象クラスがそれほど重要なのか? – jglievano