Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展接口中的Actionscript重写方法与Java?_Java_Actionscript 3_Class_Inheritance_Interface - Fatal编程技术网

扩展接口中的Actionscript重写方法与Java?

扩展接口中的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

与Actionscript语义相比,我更熟悉Java的类和接口语义,但我有一个例子,其中一些代码在Java中工作,而在Actionscript中不工作。这种重复性是一个严重的问题,因为我正试图从Java DTO代码生成Actionscript值对象,除非语义相同,否则我会陷入困境

以下是在Java中工作但无法在Actionscript中编译的代码:

接口A:

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
    }
}