我上了这堂课,让我们称之为: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];
}
}
}
}
}
答案 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和字符串。