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

时间:2011-10-20 14:56:40

标签: java actionscript-3 class inheritance interface

我更熟悉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;
}

3 个答案:

答案 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,否则它将失败。