如何强制接口出现在所有继承级别

时间:2018-10-19 18:43:53

标签: java inheritance interface override

我有一个接口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中?

2 个答案:

答案 0 :(得分:2)

简短的答案是你做不到。

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

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

请注意,Java中的接口通常是Pascal大小写的,即MyIf,而不是myIf。另外,也不需要在具有已声明其实现接口的父级的后代类中实际使用Implements关键字。

答案 1 :(得分:1)

您已经说过,只要超类提供了abstract或interface方法的实现,编译器就不会在意。

我几乎无法想象需要在每个子类中实现一个方法的任何用例,但是如果您确实需要它,则可以使用带有Class#getDeclaredMethods的反射来实现一个解决方案(仅返回在该类中声明的方法)验证每个类是否实现或重写了该方法。如果不是,则抛出异常。