如何强制接口存在于所有继承级别



我有一个接口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和Parent都将扩展AbstractParent,并且必须提供自己的接口方法的实现,这些方法被声明为抽象。

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

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

我很难想象任何用例需要在每个子类中实现一个方法,但是如果您确实需要它,您可以使用反射和Class#getDeclaredMethods(仅返回此类中声明的方法(来实现解决方案,以验证每个类是否实现或覆盖该方法。如果没有,请引发异常。

相关内容

最新更新