函数覆盖,返回具有特殊类型的Vector

时间:2011-07-18 10:50:54

标签: flash actionscript

是否可以实现一个子类,它覆盖一个函数,它返回一个带有专门实例的Vector?

示例:

class ClassA{
    protected _vector:Vector.<DisplayObject>;

    public function get vector():Vector.<DisplayObject>{
        return _vector;
    }
}

class ClassB extends ClassA{

    public override function get vector():Vector.<Sprite>{
          return Vector.<Sprite>(_vector);
    }
}

当我尝试这样时,我在编译时遇到“非法覆盖”错误。 我认为那是因为功能签名不相同。 但是我怎么能解决这个问题呢?

4 个答案:

答案 0 :(得分:1)

您可以让get函数返回“unknown”类型的向量:

class ClassA
{
    protected _vector : Vector.<DisplayObject>;

    public function get vector() : Vector.<*>
    {
        return _vector;
    }
}

class ClassB extends ClassA
{
    public override function get vector() : Vector.<*>
    {
        return Vector.<Sprite>(_vector);
    }
}

或者你可以返回*而不是Vector。&lt; *&gt;两者都应该允许你做类似

的事情
var sprites : Vector.<Sprite> = classBInstance.vector;

并允许您覆盖get函数并返回所需的类型。

答案 1 :(得分:0)

你的覆盖对我没有任何意义......:)

如果你想要取回整个矢量,你只需要使用ClassA中的get vector(), 无需覆盖它:

class ClassA{
protected _vector:Vector.<DisplayObject>;

    public function get vector():Vector.<DisplayObject>{
        return _vector;
    }
}

如果你想从矢量(ClassB或ClassA)中获取特定的精灵:

public function getSprite ( id : int ) : Sprite
{           
    try
    {
        return _vector[id] as Sprite;
    }
catch ( e : Error ) {}

    return null;
}

如果你想获得所有带有Sprite Types(ClassB或ClassA)的向量:

public function get vectorAsSprite ():Vector.<Sprite>
{
   return Vector.<Sprite> ( _vector );
}

答案 2 :(得分:0)

覆盖必须在AS3中具有相同的功能签名,因此您提出的建议是不可能的。

您需要使用不同的签名编写一个单独的函数,该函数只返回原始向量,但是转换为所需的类型。

这可能是也可能不值得你努力。

答案 3 :(得分:0)

这是ActionScript3中Vector类的主要问题。它基本上可以防止任何形式的多态性。你需要以某种方式记住你的类返回什么样的对象。最简单的方法是不覆盖函数,而是保持原样并将每个元素转换为适当的形式。