为什么我无法将类的实例转换为AS3中类的子类的实例?

时间:2011-09-15 17:03:06

标签: flash actionscript-3

我正在使用一个具有返回某个类Engine实例的函数的库。

我想介绍一些Engine的接口,所以我将它子类化为class InterfacedEngine extends Engine implements AwesomeInterface

但是当我改变使用这个类的代码时:

var engine:Engine = generateEngine();

到此:

var interfacedEngine:InterfacedEngine = generateEngine();

它给我一个运行时错误(elision mine):

TypeError: Error #1034: Type Coercion failed: cannot convert ...::Engine@1bc2bf11 to ....InterfacedEngine.

我误解了AS3课程怎么样?

2 个答案:

答案 0 :(得分:2)

此类问题的一个解决方案是代理设计模式。 您可以在此处阅读:http://www.oodesign.com/proxy-pattern.html

基本上,您为另一个类创建占位符。这是通过组合而不是继承来完成的。

diagram

InterfaceEngine应该接受Engine类型的对象作为构造函数参数。 AwesomeINterface定义了您需要的所有Engine方法。 InterfaceEngine只是将方法调用传递给它所持有的Engine对象的相应方法。

答案 1 :(得分:1)

如果B是基类而D延伸B则D是B,但不是相反。这意味着类型B的引用可以引用B和D.但类型D的引用只能引用D,而不是B. InterfacedEngine只能引用InterfacedEngine,而不是引用Engine }}。但Engine类型可以指代EngineInterfacedEngine

var eng1:Engine = new Engine(); // valid
var eng2:Engine = new InterfacedEngine(); // valid
var eng3:InterfacedEngine = new InterfacedEngine(); // valid
var eng4:InterfacedEngine = new Engine(); // not valid