【问题标题】:Actionscript overriding methods in extended interfaces vs Java?扩展接口与 Java 中的 Actionscript 覆盖方法?
【发布时间】:2011-12-11 21:04:28
【问题描述】:

我对 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;
}

【问题讨论】:

  • 我已经很久没有玩 Java 了,但不知何故我怀疑这在 Java 中也行得通。
  • 如果您不打算遵循界面,那么界面的意义何在?
  • 我正在关注它。 Ib 比 Ia 更具体,因此是兼容的。这就是为什么这段代码可以在 Java 中编译和工作的原因。任何实现 Ib 的东西都会实现 Ia。
  • 这在 Java 中真的有效吗?
  • 是的!事实上,它是双向的……类 B 用更具体的返回类型覆盖方法,而接口 Ib 用更具体的返回类型覆盖方法。它之所以有效,是因为 Ia 的合同得到维护。例如,如果我将 Ib 或 B 类中的覆盖方法的返回类型更改为“int”,它会引发错误,但由于 Ib“IS A”Ia,它不会正确。

标签: java actionscript-3 class inheritance interface


【解决方案1】:

界面上的“makeCopy()”返回一个Ia。而在实现中它返回一个 Ib。除非 Ib 是 Ia,否则它将失败。

【讨论】:

  • 我同意,除了 Ib 是 Ia -- 所以它永远不会失败。
  • @HDave Ib 不是 Ia。 (Ib==Ia)=假; Ib 扩展了 Ia,这意味着 Ib 也继承了 makeCopy()。它仍然会返回 Ia
  • 任何实现 Ib 的东西都遵守 Ia 的契约。这就是为什么它在 Java 中编译和运行良好的原因。
  • @HDave Ia 和 Ib 是否在 Java 端扩展了一个抽象类?
  • No...Java 中的代码与 Actionscript 中的代码一样,可以正常编译和运行。另外,我所说的 Ib “是 a” Ia 并不意味着相等,它的意思是“是 a”。请参阅上面的评论...如果我要修改被覆盖的方法以返回“int”,那么 Java 将无法编译,因为 int“不是”Ia,但 Ib“是”Ia,因此它可以在 Java 中使用。只是希望它也可以在 Actionscript 中使用。
【解决方案2】:

从 ActionScript 的上下文来看,makeCopy() 的返回类型具有不兼容的签名。

接口 Ia 定义 makeCopy 返回 Ia。

接口 Ib 扩展将从 makeCopy 返回 Ia 基础。将 makecopy():Ib 添加到接口 Ib 是对 Ia 中定义的不兼容覆盖。

在 B 类中,不兼容的签名要求 makeCopy 返回 Ia。

也许您想要完成的更像是一个抽象类,您应该在其中扩展 A 和 B 类。

【讨论】:

  • 即使使用 Actionscript 继承,“覆盖”方法也必须具有完全相同的签名,是吗?我认为这意味着更改签名以返回最初指定类型的子类型将不起作用。
【解决方案3】:

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

【讨论】:

  • Shane - 您的解决方案有效,但我非常希望保持类型尽可能具体。但是您的回答让我想到我可以修改更高级别 actionScript 接口的代码生成以不包含这些方法……从而将它们降级为标记接口。这两种解决方案都不是理想的,但必须给予一些东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多