我有一个接口myIf
,我想在所有继承级别中都使用这个接口。这个想法是,fooEverywhere
必须位于GrandParent
和Parent
处,并且必须是其他子节点。因此出现了这种明显的模式:
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
中?
答案 0 :(得分:2)
简短的答案是你做不到。
更长的答案是您不能,因为您已经在继承链中更高的类中提供了实现。一旦将其实施在链中更高的位置,就会实施。
您可以创建一个抽象类作为实现接口的祖先,然后将接口方法声明为抽象祖先上的抽象。然后,GrandParent和Parent都将扩展AbstractParent,并且必须提供自己的声明为abstract的接口方法的实现。
请注意,Java中的接口通常是Pascal大小写的,即MyIf,而不是myIf。另外,也不需要在具有已声明其实现接口的父级的后代类中实际使用Implements关键字。
答案 1 :(得分:1)
您已经说过,只要超类提供了abstract或interface方法的实现,编译器就不会在意。
我几乎无法想象需要在每个子类中实现一个方法的任何用例,但是如果您确实需要它,则可以使用带有Class#getDeclaredMethods
的反射来实现一个解决方案(仅返回在该类中声明的方法)验证每个类是否实现或重写了该方法。如果不是,则抛出异常。