我有这样的Goo课程:
public class Goo extends Node
{
public function Update(dt:Number):void
{
// function to be overriden
trace("updating Goo");
}
}
和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对象的Manager,并按照以下方式更新它们:
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 :(得分:2)
你的示例在逻辑上对于Actionscript3是正确的,但是你可能会在管理器的构造函数上引起混淆,因为它会产生任意类型的随机对象。要更好地测试问题,请将管理器的构造函数替换为:
public function Manager():void
{
gooArray.push(new GooY());
gooArray.push(new GooX());
}
此问题可能是您正在使用的编译器中的一个奇怪错误。尝试升级到最新的SDK,做一个干净的项目,看看你是否仍然遇到同样的问题。
最后,这个“节点”对象是什么?也许,作为一个非常不可能的想法,Node是某种劫持方法调用的对象代理。但是,我怀疑这适用于您的项目。