扩展接口中的Actionscript重写方法与Java?
与Actionscript语义相比,我更熟悉Java的类和接口语义,但我有一个例子,其中一些代码在Java中工作,而在Actionscript中不工作。这种重复性是一个严重的问题,因为我正试图从Java DTO代码生成Actionscript值对象,除非语义相同,否则我会陷入困境 以下是在Java中工作但无法在Actionscript中编译的代码: 接口A:扩展接口中的Actionscript重写方法与Java?,java,actionscript-3,class,inheritance,interface,Java,Actionscript 3,Class,Inheritance,Interface,与Actionscript语义相比,我更熟悉Java的类和接口语义,但我有一个例子,其中一些代码在Java中工作,而在Actionscript中不工作。这种重复性是一个严重的问题,因为我正试图从Java DTO代码生成Actionscript值对象,除非语义相同,否则我会陷入困境 以下是在Java中工作但无法在Actionscript中编译的代码: 接口A: public interface Ia { function makeCopy():Ia; } 接口B: public inte
public interface Ia {
function makeCopy():Ia;
}
接口B:
public interface Ib extends Ia {
}
B类(不会编译):
我不明白为什么类B在接口B扩展接口a时抛出一个关于“makeCopy”的不兼容签名的编译错误…因此没有违反类型或不兼容。如果这只是一个Actionscript限制,有人能建议一种重新编码的方法吗
注意:我已经尝试将接口B更改为此,但它在接口B(在Java中工作)中抛出了一个错误:
接口上的“makeCopy()”返回Ia。而在实现中,它返回一个Ib。除非Ib是Ia,否则它将失败。从ActionScript的上下文来看,makeCopy()的返回类型具有不兼容的签名 接口Ia定义生成副本返回Ia 接口Ib扩展将从makeCopy返回Ia base。将makecopy():Ib添加到接口Ib是对Ia中定义的不兼容重写 在类B中,不兼容的签名要求makeCopy返回Ia
也许您试图实现的更像是一个抽象类,您应该在其中扩展A和B类。在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
}
}
我同意,除了Ib是Ia,所以它永远不会失败。@HDave Ib不是Ia。(Ib==Ia)=错误;Ib扩展了Ia,这意味着Ib还继承了makeCopy()。如果Ib遵守Ia的合同,则它仍将返回任何实现Ib的内容。这就是为什么它在Java中编译和运行得很好。@HDave Ia和Ib是否在Java端扩展了一个抽象类?不……Java中的代码与Actionscript中的代码一样,编译和运行得很好。还有,我说Ib“是一个”Ia并不意味着平等,而是意味着“是一个”。请看上面我的评论……如果我修改被重写的方法以返回“int”,那么Java将不会编译,因为int“不是”Ia,但Ib“是”Ia,所以它在Java中工作。只希望Actionscript中也有。即使使用Actionscript继承,“重写”方法也必须具有完全相同的签名是吗?我认为这意味着更改签名以返回最初指定类型的子类型将不起作用。我已经很久没有玩Java了,但不知何故,我怀疑这在Java中也能起作用。如果你不遵循它,接口的意义是什么?我正在遵循它。Ib比Ia更具体,因此兼容。这就是这段代码在Java中编译和工作的原因。任何实现Ib的东西都实现Ia。这在Java中真的有效吗?是的!事实上,它是双向工作的……类B用更具体的返回类型重写方法,接口Ib用更具体的返回类型重写方法。它之所以有效,是因为Ia的合同得到了维护。例如,如果我要将Ib或类B中重写方法的返回类型更改为“int”,它会抛出一个错误,但由于Ib“是”Ia,因此它不会正确地返回。Shane-您的解决方案可行,但我非常希望保持类型尽可能具体。但你的回答让我想到,我可以修改更高级actionScript接口的代码生成,使其不包含这些方法……从而将它们降级为标记接口。这两种解决方案都不理想,但必须给出一些东西。。。。
public interface Ib extends Ia {
function makeCopy():Ib;
}
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
}
}