我有一个名为I的接口。此接口由抽象类AClazz实现。
AClazz implements I
现在,此抽象类由几个具体的类扩展。
ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz
现在,当我向接口添加新的方法协定时,为什么eclipse以及Java语言会抱怨具体类(ConcreteClazz和AnotherConcreteClazz)内部而不是抽象类AClazz内部缺少实现?
如果AClazz是一个具体类(而不是抽象类)并且从非抽象AClazz扩展了具体类,那么Java会再次抱怨在具体类内部缺少实现吗?
最佳答案
假设您的界面I
具有方法m
:
public interface I {
public void m (int someParameter);
}
现在,
AClazz
实现了I
,而ConcreteClazz
扩展了AClazz
。这意味着ConcreteClazz
也实现I
,无论您是否在class
的ConcreteClazz
声明中明确声明。这意味着您可以在需要ConcreteClazz
的任何地方使用I
对象。所以说在某个其他班级的某个地方,您有一个方法void takeSomeAction(Something x, I y) {
....
y.m (x.getSomeProperty()); // call the interface method
....
}
您可以使用
ConcreteClazz
对象调用它:ConcreteClazz z = new ConcreteClazz(...);
Something st;
foo.takeSomeAction(st, z);
您正在给
takeSomeAction
一个ConcreteClazz
用作其I
参数。然后takeSomeAction
将调用m
方法。除非您在某处提供了m
的实现,否则如何工作?这就是为什么您需要在
m
或AClazz
中实现ConcreteClazz
的原因。如果这样做是对的,则可以在AClazz
中实现它,然后就不必在ConcreteClazz
中提供其他实现。但是,如果您未在AClazz
中实现它,则不会导致任何错误,因为在运行时,您实际上不能拥有类型为AClazz
的对象。但是,由于您可以具有类型为ConcreteClazz
的对象,这意味着对于ConcreteClazz
,某处必须具有m
的实现。