我对
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;
}
最佳答案 在AS3中,方法签名在实现和继承中必须相同,因此如果您最初将makeCopy的返回类型定义为Ia,那么它必须保留在所有后代接口及其实现中.
但是,你可以做的是返回一个对象的实例,该对象通过用Ia签名的函数实现Ib,因为它仍然是Ia的有效实现:
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
}
}