java – 为什么超类实现了应该由子实现的接口方法?

这是一个父类

public class Parent {
    public void f() {

    }
}

这是一个简单的界面

public interface If {
    public void f();
}

这是一个儿童班

public class Child extends Parent implements If{}

我的问题是:
 虽然它是声称实现接口If的Child,但接口方法是在Parent中实现的.为什么允许这样做?

最佳答案

Why is this allowed?

因为孩子满足合同. Child通过实现If使得它将提供一个不接受任何参数且没有返回值的公共f函数.它做到了.它是如何做到的,在这种情况下,通过从超类继承它,是无关紧要的.合同是满意的,这是最重要的.

the interface method is implemented in Parent

不是真的,它碰巧有f方法.如果你做了如果inst = new Parent()你会得到一个编译错误,因为Parent没有说它实现了If(没有实现If if);实施If不是其合同的一部分.另一方面,孩子确实提供了合同,所以如果inst = new Child()工作正常.

FWIW,你可能不会故意这样做,尽管可以说没有任何问题.但是如果你想要使用的超类完全适合你想要实现的接口中的一个方法,它就会出现.

当发生这种情况时,您有三种选择:

>什么都不做,让Parent的方法直接实现接口方法.
>覆盖父方法,即使你不打算做任何不同的事情,例如:

@Override
public void f() {
    super.f();
}

…除非你有想要在调用Parent的f之前或之后运行的代码,否则它实际上无法完成任何事情.
>覆盖f并自己实现,忽略Parent的版本.但是,如果Parent的f与接口方法的f完全不同,那只会有意义 – 在这种情况下,你不应该首先对Parent进行子类化,因为如果你根据接口的行为重新实现f,你的f赢了’ t再次满足Parent#f契约(就其行为而言),你将打破子类化的“是一个”规则.

所以,如果它有机地发生,那么选项1是完全合理的.你可能不会故意设置它.

转载注明原文:java – 为什么超类实现了应该由子实现的接口方法? - 代码日志