繁体   English   中英

Java接口合同问题

[英]Java Interface Contracts Issue

我有一个名为I的界面。 该接口由抽象类AClazz实现。

AClazz implements I

现在,这个抽象类由几个具体类扩展。

ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz

现在,当我添加一个新的方法合同的界面为什么日食,因此Java语言抱怨的具体类(ConcreteClazzAnotherConcreteClazz)内,而不是抽象类AClazz内缺少实施?

如果AClazz是一个具体的类(而不是抽象的),并且从非抽象的AClazz扩展的具体类将Java抱怨在具体类中再次缺少实现?

Abstract class means, this class contains abstract methods (ie no implementation, only definition of method), the classes that are extending it must implement the unimplemented methods

由于Interface contains 100% pure public abstract methodsmust be implemented by the classes that are implementing它们must be implemented by the classes that are implementing ,除非它被标记为abstract 再次遵循上述规则。

所以说你的界面I有一个方法m

public interface I {
     public void m (int someParameter);
}

现在AClazz实现了I ,而ConcreteClazz扩展了AClazz 这意味着ConcreteClazz也实现了I ,无论你是否在ConcreteClazzclass声明中明确说明。 这意味着您可以在任何I期望的地方使用ConcreteClazz对象。 所以说某个地方,在其他一些课程中,你有一个方法

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提供了一个实现,否则这怎么办?

这就是你需要在AClazzConcreteClazz实现m的原因。 可以AClazz实现它,如果这是正确的事情,那么您不需要在ConcreteClazz提供另一个实现。 但是如果你没有在AClazz实现它,它不会导致任何错误,因为在运行时,你实际上不能拥有AClazz类型的对象。 但是因为你可以拥有ConcreteClazz类型的对象,这意味着在某个地方,对于ConcreteClazz ,必须有m的实现。

无论添加多少新的抽象方法,抽象类仍然是抽象的。 因此,当您在I接口中添加一个由抽象类实现的新方法时,编译器不会抱怨。

具体类不能有任何抽象方法,因为您的子类正在扩展您的抽象类,并且该类没有为接口实现新添加的方法,因此编译器会抱怨。 因为新添加的抽象方法在所有子类中继承,并且具体类不能具有抽象方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM