我正在使用一个具有返回某个类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课程怎么样?
答案 0 :(得分:2)
此类问题的一个解决方案是代理设计模式。 您可以在此处阅读:http://www.oodesign.com/proxy-pattern.html
基本上,您为另一个类创建占位符。这是通过组合而不是继承来完成的。
InterfaceEngine应该接受Engine类型的对象作为构造函数参数。 AwesomeINterface定义了您需要的所有Engine方法。 InterfaceEngine只是将方法调用传递给它所持有的Engine对象的相应方法。
答案 1 :(得分:1)
如果B是基类而D延伸B则D是B,但不是相反。这意味着类型B的引用可以引用B和D.但类型D的引用只能引用D,而不是B. InterfacedEngine
只能引用InterfacedEngine
,而不是引用Engine
}}。但Engine
类型可以指代Engine
和InterfacedEngine
。
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