构造函数被无缘无故地调用

时间:2013-02-01 00:50:18

标签: actionscript-3 constructor

我上了这堂课,让我们称之为:Klass。

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

我在另一个类中创建了Klass类的对象,让我们调用它:“MotherClass”。

现在是时候它变得奇怪了,在我实例化对象Klass之后,Klass的构造函数再次被调用,就在MotherClass的构造函数结束之后(我放置了一个断点并且我一步一步地跟着),带有null构造函数参数。

问题是,我没有第二次调用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);
                }

            }
        }
    }   
}

这是Klass:

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];
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

好的,这似乎正在发生:

你有一个applyLevel的setter,它会覆盖超类'setter。我认为你的超级二传手也会被执行。一些观察结果引出了我的结论:

  • 你的setter方法会覆盖超类方法,但不会在super.applyLevel = level处执行。这意味着在超类中,应该保持级别值的存储变量是未初始化的。 Actionscript中未初始化的整数默认为0.

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

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

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

我不清楚谁是调用超级类applyLevel的版本也许超级类(EntityVO)正在它的构造函数中执行...希望这应该足以指出你朝着正确的方向前进。

答案 1 :(得分:0)

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