Actionscript覆盖扩展接口与Java的方法?

我对
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
    }
}
点赞