我更熟悉Java的类和接口的语义,而不是使用ActionScript语义,但我有一些代码可以在Java中工作但在Actionscript中不起作用。这种严重性是一个严重的问题,因为我试图从Java DTO编写生成我的Actionscript值对象,除非语义相同,否则我遇到了很大的麻烦。
这是在Java中工作的代码,无法在Actionscript中编译:
界面A:
public interface Ia {
function makeCopy():Ia;
}
接口B:
public interface Ib extends Ia {
}
B类(不会编译):
public class B implements Ib {
public function makeCopy():Ib {
return null;
}
}
我不明白为什么当接口B明确地扩展接口A时,为什么B类会抛出关于“makeCopy”的不兼容签名的编译错误...因此不会违反类型或不兼容性。如果这只是一个Actionscript限制,有人可以建议一种重新编码的方法吗?
注意:我已经尝试将接口B更改为此,并在接口B中引发错误(在Java中工作):
public interface Ib extends Ia {
function makeCopy():Ib;
}
答案 0 :(得分:1)
从ActionScript的上下文中,makeCopy()的返回类型具有不兼容的签名。
接口Ia定义makeCopy返回Ia。
接口Ib扩展将从makeCopy返回Ia base。添加makecopy():Ib到接口Ib是对Ia中定义的不兼容覆盖。
在B类中,不兼容的签名要求makeCopy返回Ia。
也许你想要完成的更像是一个抽象类,你应该扩展A和B类。
答案 1 :(得分:1)
在AS3中,方法签名在实现和继承中必须相同,因此如果您最初将makeCopy
的返回类型定义为Ia
,那么它必须保留在所有后代接口及其实现中的方式
然而,您可以通过使用Ib
签名的函数返回实现Ia
的对象的实例,因为它仍然是Ia
的有效实现:< / p>
public class B implements Ib {
public function makeCopy():Ia {
return this;
}
public function B() {
trace(makeCopy() is Ia); //true
trace(makeCopy() is Ib); //true
trace(makeCopy() is B); //true
}
}
答案 2 :(得分:0)
接口上的“makeCopy()”返回一个Ia。而在实现中它返回Ib。除非Ib是Ia,否则它将失败。