ActionScript 3子类'方法继承问题

时间:2012-01-20 21:04:58

标签: flash actionscript-3 inheritance casting

我有这样的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");
    }
}

然后是一个创建Go​​o对象的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 GooXgooArray[i] is GooY检测它是哪种类型,但两者始终都是false。即使我强制使用gooArray[i] as GooX进行投射,总是表示该对象为null

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

1 个答案:

答案 0 :(得分:2)

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

public function Manager():void
{
    gooArray.push(new GooY());
    gooArray.push(new GooX());
}

此问题可能是您正在使用的编译器中的一个奇怪错误。尝试升级到最新的SDK,做一个干净的项目,看看你是否仍然遇到同样的问题。

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