0

私はこのクラスを取得しました。それをクラスと呼びましょう。

クラスKlassには、デフォルト値がnullの配列であるコンストラクターのパラメーターがあります。

別のクラス内にクラスKlassのオブジェクトを作成し、それを「MotherClass」と呼びましょう。

オブジェクトKlassをインスタンス化した後、MotherClassのコンストラクターが終了した直後(ブレークポイントを設定し、ステップバイステップで実行)に、コンストラクターパラメーターがnullの状態で、Klassのコンストラクターが再度呼び出されます。

問題は、Klassのコンストラクターを2回呼び出しているもののスタックトレースがないことです。そのコンストラクターを再度呼び出すことができるかどうかの手がかりはありません...

何か案は?

ありがとう。

(Klassはインターフェイスを実装しており、配列を使用してインスタンスを作成していますが、それが何かに影響を与えているかどうかはわかりません)

要求に応じて追加されたコード:

これはクラスMotherKlassです:

public class Unit extends EntityVO{

    public function Unit(level:int = 1)
            {
                //init vars and stuff
                //...
                //

                initLevelData();
                applyLevel = level;

            }

            private function initLevelData():void {

                levelData[1] = [500,  [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level, 120]], "unit_level1"];
                levelData[2] = [1000, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level,  90]], "unit_level2"];
                levelData[3] = [2000, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level,  80]], "unit_level3"];
                levelData[4] = [5000, [[Spawn, this.entityToSpawn.type, this.entityToSpawn.level,  60]], "unit_level4"];

            }

            override public function set applyLevel(level:int):void {

                power     = power / maxPower * levelData[level][0]; 
                maxPower  = levelData[level][0];
                behavior  = levelData[level][1];

                for (var i:int = 0; i < behavior.length; i ++){
                    _behaviorSteps[i] = new behavior[i][0](behavior[i].slice(1));
                    _behaviorReqs.push(_behaviorSteps[i].req);
                }

            }
        }
    }   
}

これはクラスです:

public class Spawn {

    public class Spawn implements IBehavior
        {
            private var _entityType:String;
            private var _entityLevel:int;
            private var _spawnRate:int;

            public function Spawn(params:Array = null){
                //had to put the if because of the second weird call to the constructor with null
                if(params){
                    _entityType = params[0];
                    _entityLevel = params[1];
                    _spawnRate  = params[2];
                }
            }
        }
    }
}
4

2 に答える 2

0

わかりました、これは起こっているように見えることです:

applyLevelスーパークラスのセッターをオーバーライドするセッターがあります。あなたのスーパークラスセッターも実行されていると思います。この結論に私を導くいくつかの観察:

  • セッターメソッドはスーパークラスメソッドをオーバーライドしますが、どこでそれを行うのかはわかりませんsuper.applyLevel = level。これは、スーパークラスでは、レベル値を保持する必要があるストレージ変数が初期化されていないことを意味します。Actionscriptの初期化されていない整数のデフォルトは0です。

  • Spawnのコンストラクターの2番目の呼び出しにはパラメーターがないことに言及しました。これは、の配列がlevelDataインデックス1から始まるために発生します。したがって、この配列のインデックス0はnullです。

  • したがって、setterメソッドのスーパークラスバージョンは、applyLevel上からnull要素を渡します。

これらの事実は100%正しいと思います。

誰がスーパークラスのバージョンを呼び出しているのかがわかりません。applyLevelおそらく、スーパークラス(EntityVO)がコンストラクターでそれを行っているのでしょう...うまくいけば、これで正しい方向を示すことができます。

于 2013-02-01T21:23:36.280 に答える
0

Cirrusを介してクラスUnitのインスタンスを受け取り、RegisterClassAliasを使用してオブジェクトを逆シリアル化します。そうすると、何らかの理由でSpawnのインスタンスを自動的にインスタンス化する必要があるようです。そのため、デフォルトの引数なしでojbectsを渡すことはできません。この場合、nullの引数(params [0])を使用しているため、エラーがスローされます。コードの他の部分でCirrusを使用していますが、パラメーターコンストラクターにすべてのintと文字列があるため、問題なく機能します。

于 2013-02-03T18:08:58.987 に答える