Flash ActionScript 3子类';方法继承问题

Flash ActionScript 3子类';方法继承问题,flash,actionscript-3,inheritance,casting,Flash,Actionscript 3,Inheritance,Casting,我有一门课是这样的: public class Goo extends Node { public function Update(dt:Number):void { // function to be overriden trace("updating Goo"); } } public class Manager { private var gooArray:Vector.<Goo> = new Vector.&l

我有一门课是这样的:

public class Goo extends Node
{
    public function Update(dt:Number):void
    {
        // function to be overriden
        trace("updating Goo");
    }
}
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的一个子类称为GooX:

public class GooX extends Goo
{
    override public function Update(dt:Number):void
    {
        trace("updating GooX");
    }
}
还有一个叫“粘液”:

public class GooY extends Goo
{
    override public function Update(dt:Number):void
    {
        trace("updating GooY");
    }
}
然后是一个管理器,它创建Goo对象并按如下方式进行更新:

public class Goo extends Node
{
    public function Update(dt:Number):void
    {
        // function to be overriden
        trace("updating Goo");
    }
}
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);
        }
    }
}
公共类管理器
{
私有变量数组:向量。=新向量。();
公共函数管理器():无效
{
var aGoo:Goo;
如果(Math.random()>=0.5)
{
aGoo=新的GooX();
}
其他的
{
aGoo=新粘性();
}
gooArray.push(aGoo);
}
公共功能更新(dt:编号):无效
{
for(变量i:int=0;i
此代码始终在跟踪日志中显示“更新Goo”。我还试着通过做一个
gooArray[I]是GooX
gooArray[I]是goy
来检测它是哪种类型,但对于这两种类型,它总是
false
。即使我强制将
gooArray[I]转换为GooX
,它也总是说对象为
null


有人知道我要做的事情的方法吗(让调用的是子类的更新,而不是父类的更新)?谢谢。

您的示例在逻辑上与Actionscript3是正确的,但是您可能会对manager的构造函数产生混淆,因为它会生成任意类型的随机对象。为了更好地测试问题,请将管理器的构造函数替换为:

public function Manager():void
{
    gooArray.push(new GooY());
    gooArray.push(new GooX());
}
这个问题可能是您正在使用的编译器中的一个奇怪错误。尝试升级到最新的SDK,做一个干净的项目,看看是否仍然会遇到同样的问题


最后,这个“节点”对象是什么?也许,作为一种极不可能的想法,该节点是某种劫持方法调用的对象代理。但是,我怀疑这是否适用于您的项目。

我只是几乎一字不差地输入了您在这里发布的代码,我没有得到与您相同的结果。我调用了重写的方法,所以我想你还有别的事情要做。类对我来说工作很好。Flash Player 11.0.1.152使用Flex 4.1 SDK在FlashBuilder中编译。我得到的输出是“更新GooX”。如果我把它插入一个ENTER_FRAME循环,我会在GooX和GooY之间得到一个相当均匀的分散。这很奇怪,我使用Flash Builder 4.6、Flex SDK 4.1和Flash Player 11运行它。它不起作用。谢谢,你是对的,这个例子在逻辑上是正确的,而且它本身也在起作用。我想我可能已经发现了问题。当然,示例代码属于更广泛的项目,我正在抽象相关部分,以防遗漏某些内容(我不是AS3方面的专家)。问题是有人正在克隆子类的Goo对象,并使其再次成为Goo对象。也许是抽象类如此重要的原因?