是否可以实现一个子类,它覆盖一个函数,它返回一个带有专门实例的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);
}
}
当我尝试这样时,我在编译时遇到“非法覆盖”错误。 我认为那是因为功能签名不相同。 但是我怎么能解决这个问题呢?
答案 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类的主要问题。它基本上可以防止任何形式的多态性。你需要以某种方式记住你的类返回什么样的对象。最简单的方法是不覆盖函数,而是保持原样并将每个元素转换为适当的形式。