【问题标题】:How to force an interface to be present at all levels of inheritance如何强制接口出现在所有继承级别
【发布时间】:2019-03-24 16:39:35
【问题描述】:

我有一个接口myIf,我希望它出现在所有继承级别。这个想法是fooEverywhere 需要在GrandParentParent 以及更多的孩子。所以出现了这种明显的模式:

  public interface myIf {
    void fooEverywhere ();
  }

  public class GrandParent implements myIf {

    @Override
    public void fooEverywhere() { /* Actions */ }

  }

  public class Parent extends GrandParent implements myIf {
    @Override
    public void fooEverywhere() { super.fooEverywhere(); /* And Other actions */ }
  }

但是,如果我像这样忘记/错过Parent

  public class Parent extends GrandParent /*implements myIf*/ {
//    @Override
//    public void fooEverywhere() { super.fooEverywhere(); /* And Other actions */ }
  }

Java,仍然可以,因为 parentObject.fooEverywhere() 会找到 GrandParent.fooEverywhere()

因此,我如何重新设计它以强制 Java 识别 fooEverywhere 必须在 Parent 中?

【问题讨论】:

  • 我不确定你的意图是什么,但抽象类应该可以为你处理这个要求。
  • 虽然我喜欢你的问题,但我不明白你的目标是什么。通过扩展 GrandParent,您将隐式实现 myIf。
  • @MarcinKrasowski - 不能保证任何类都是抽象的。
  • 斯特凡所说的。 -> force Java to recognise that fooEverywhere must be in Parent 它已经做到了。所有扩展Parent 的类都必须实现fooEverywhere(因为Parent 提供了一个实现,默认情况下它们会这样做)。
  • 那么不要提供默认实现。 (换句话说,不提供实现的抽象类在这里可能会更好。)

标签: java inheritance interface overriding


【解决方案1】:

正如您已经说过的,只要超类提供抽象或接口方法的实现,编译器就不会在意。

我几乎无法想象有什么用例需要在每个子类中实现一个方法,但是如果你真的需要它,你可以使用 Class#getDeclaredMethods 的反射来实现一个解决方案(只返回在这个类中声明的方法)来验证如果每个类都实现或覆盖该方法。如果不是,则抛出异常。

【讨论】:

    【解决方案2】:

    简短的回答是你不能。

    更长的答案是您不能,因为您已经在继承链中更高的类中提供了实现。一旦它在链中的更高层实施,它就会被实施。

    您可以创建一个抽象类作为实现接口的祖先,然后在抽象祖先上将接口方法声明为抽象。然后,GrandParent 和 Parent 都将扩展 AbstractParent 并且必须提供它们自己的接口方法的实现,这些接口方法被声明为抽象。

    注意,Java 中的接口通常是 Pascal-case,即 MyIf,而不是 myIf。此外,没有必要在父类已经声明它实现接口的子类中实际使用 implements 关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2023-03-25
      相关资源
      最近更新 更多