0

我有这门课,我们称之为:Klass。

Klass 类的构造函数有一个参数,该参数是一个默认值为 null 的数组。

我在另一个类中创建了一个类 Klass 的对象,我们称之为:“MotherClass”。

现在是当它变得奇怪时,在我实例化对象 Klass 之后,再次调用 Klass 的构造函数,就在 MotherClass 的构造函数结束之后(我放置了一个断点,我一步一步地跟随),构造函数参数为空。

问题是,我没有第二次调用 Klass 构造函数的任何东西的堆栈跟踪,不知道什么会再次调用该构造函数......

有任何想法吗?

谢谢。

(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

我通过 Cirrus 接收 Unit 类的实例,并使用 RegisterClassAlias 反序列化对象。当我这样做时,似乎出于某种原因必须自动实例化 Spawn 的实例。这就是为什么你不能在没有默认参数的情况下传递 ojbects。在这种情况下,它会引发错误,因为我正在使用 (params[0]) 为空的参数。我在代码的其他部分使用 Cirrus,它工作正常,因为它们的参数构造函数中有所有整数和字符串。

于 2013-02-03T18:08:58.987 回答
0

好的,这似乎正在发生:

你有一个 setterapplyLevel覆盖了超类的 setter。我认为你的超级二传手也被处决了。一些观察使我得出这个结论:

  • 您的 setter 方法覆盖了超类方法,但它没有在哪里做super.applyLevel = level。这意味着在超类中,应该保持级别值的存储变量未初始化。Actionscript 中未初始化的整数默认为 0。

  • 您提到Spawn' 构造函数的第二次调用没有参数。发生这种情况是因为您的数组levelData从索引 1 开始。所以该数组的索引 0 为空。

  • 所以applyLevelsetter 方法的超类版本是从上面传入 null 元素。

我认为这些事实是 100% 正确的。

我不清楚是谁在调用超类的版本,applyLevel也许超类 ( EntityVO) 在它的构造函数中这样做......希望这足以为您指明正确的方向。

于 2013-02-01T21:23:36.280 回答