为什么在Java中实现接口的类需要实现所有接口方法?

11

我知道接口和类可以声明为抽象来避免这种情况。

但是,实现我们在接口中声明的所有方法有什么用吗?即使这些方法对该类不相关,如果我们继续定义所有方法,这是否会增加代码的复杂性和重量?为什么要这样设计呢?


2
否则接口的意义何在? - user207421
有时候不实现所有的方法是有合理理由的,详见EventAdapters - Nathan Hughes
6个回答

21

Java中接口的概念非常类似于一个合约(也许事后看来这应该是这个概念的名称)

这个想法是,实现接口的类郑重承诺提供合同中列出的所有内容,以便任何使用实现接口的类的功能有保证可用。

根据我的经验,正是这种机制使得在Java中建造大型系统成为可能。


8
您所批评的正是接口实现的目标。 如果您不想实现一个接口,请勿声明您的类实现它。
当您使用接口进行编程时,您希望在其背后实现所有方法的具体对象。如果您的具体对象不需要或无法实现所有接口方法,则可能需要修复设计问题。
如果我们继续定义所有方法,即使对于该类而言并不相关,那么这是否会增加代码的重量和复杂性?

6
当任何一段代码接收到一个接口的实例却不知道背后的类是什么时,这段代码应该确保能够调用接口中的任何方法。这就是接口作为调用方和功能提供者之间契约的原因。唯一实现这个目标的方法是要求所有实现该接口的非抽象类都提供其所有函数的实现。
有两种通用的方式来处理不需要实现某些功能的情况:
  • 添加一个测试方法和一个抛出UnsupportedOperationException的实现。
  • 根据需要将接口拆分成若干部分,以便可以实现每个部分的所有方法。
以下是第一种方法的示例:
public interface WithOptionalMehtods {
    void Optional1();
    void Optional2();
    boolean implementsOptional1();
    boolean implementsOptional2();
}

public class Impl implements WithOptionalMehtods {
    public void Optional1() {
        System.out.println("Optional1");
    }
    public void Optional2() {
        throw new UnsupportedOperationException();
    }
    public boolean implementsOptional1() {
        return true;
    }
    public boolean implementsOptional2() {
        return false;
    }
}

以下是第二种方法的示例:
public interface Part1 {
    void Optional1();
}
public interface Part2 {
    void Optional2();
}
public Impl implements Part1 {
    public void Optional1() {
        System.out.println("Optional1");
    }
}

我能理解,但我的想法是为什么在Java中要这样实现接口中的所有方法?如果您能引用一个实时示例,我将非常高兴。正如您现在所知道的,我是一个新手。 - Deepak
1
@Deepak 如果你正在寻找一个带有可选方法的实际接口例子,可以看一下Java的List接口。除了所有检查列表内容的操作之外,它还具有十个可选操作来更改列表。 - Sergey Kalinichenko

1

如果我们继续定义所有方法,即使它与该类无关,那么这不会增加代码的重量和复杂性吗?

是的,你说得对。这就是为什么在编码中遵循接口隔离原则是最佳实践,该原则建议不要强制客户端实现他们不使用的接口。因此,您永远不应该有一个“臃肿”的接口,其中包含许多方法,而是许多小接口分组方法,每个组都服务于特定的行为或子模块。
这样,接口的客户端只实现所需的方法,而不会被迫实现他们不需要的方法。


0
在实现接口时,我们可能不需要定义接口中声明的所有方法。我们可以定义一些我们不需要的方法,方法体内为空即可。

0

这可能取决于里氏替换原则

因此,拥有A实现B意味着当需要B时可以使用A,为了使其正常工作,A必须至少具有与B相同的方法。

请记住,我的回答不是“正确”的答案,因为它不是基于官方来源的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接