【问题标题】:Override an interface?覆盖接口?
【发布时间】:2016-01-05 19:45:25
【问题描述】:

我正在为 Minecraft 游戏创建一个 mod,它有一个接口来实现游戏中的命令。我需要 mod 来实现该接口,但用不兼容的方法(不同的返回类型)覆盖它的方法之一。但我需要防止实现该接口的其他类无法工作或无法被游戏识别的情况。

我认为这需要使用与原始接口相同的新接口覆盖接口,但需要使用该方法的重载版本来支持 mod 的需求。这可能吗(或者我有其他方法可以做到这一点吗?)

【问题讨论】:

  • 不同的返回类型是原始返回类型的子类型吗?
  • 您不能用返回不同类型的方法覆盖方法。子类化接口并添加一个新方法,使用不同的名称。
  • 更具体。这个接口很可能是由 minecraft 引擎调用的,所以除非你修改它,否则不同的返回类型对调用者没有用。什么是界面?什么消耗它?为什么你“需要”修改它?
  • 如果接口有一个方法,比如int getIntVaue();,你不想尝试使用double getIntValue();覆盖它,子类化它并添加一个新方法double getDoubleValue();

标签: java interface minecraft overriding minecraft-forge


【解决方案1】:

将接口视为合同的一种方式。
实现类必须严格遵守此契约。 这意味着方法签名(包括返回值和参数)必须完全匹配。
接口的全部意义在于在不严格了解实现的情况下定义交互。

如果您希望实现的交互不同,那么您可能试图以非预期的方式使用某些东西。

即使可以对接口进行子类化,它也会很快变得混乱。 创建一个新接口可能最符合您的利益(所有其他方法都相同)。 由于它无法与使用接口 A 的类进行比较,因此您可以通过将其完全分离来省去麻烦。

【讨论】:

    【解决方案2】:

    Mojang/forge 团队提供的接口旨在用于 mojang/forge 代码。他们期望返回接口返回的结果类型。如果他们没有得到合同/接口所定义的内容,代码将崩溃/无法编译。

    似乎您正试图将接口用于自己的项目/api 的特定目的。
    考虑专门为您打算使用它的目的编写一个新接口。不要修改核心接口。

    一个类可以继承多个接口,所以这不是问题。您可以实现 AND forge/mojang 接口 AND 您自己的。

    【讨论】:

      【解决方案3】:

      您可以实现 mod 类。然后重写该方法。还要编写另一个方法,该方法将重载您实现的类中的方法。这样您就不必更改界面。

      【讨论】:

        猜你喜欢
        • 2012-11-10
        • 2014-08-18
        • 2015-01-14
        • 2013-11-14
        • 2012-12-29
        • 2014-10-23
        • 2014-07-17
        • 2021-03-26
        • 1970-01-01
        相关资源
        最近更新 更多