11

我知道这是接口的目的,并且可以将类声明为抽象以逃避它。

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

4

6 回答 6

21

Java 中接口的概念很像契约(也许回想起来,这应该是概念的名称)

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

以我的经验,这个设施是使在 Java 中建造大教堂成为可能的因素之一。

于 2012-08-25T12:17:45.880 回答
8

您所批评的正是目标界面实现的目标。如果您不想实现接口,请不要声明您的类实现它。

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

当您针对接口进行编程时,您希望其背后的具体对象实现其所有方法。如果您的具体对象不需要或无法实现所有接口方法,您可能需要解决设计问题。

于 2012-08-25T11:56:59.087 回答
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");
    }
}
于 2012-08-25T11:58:08.030 回答
1

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

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

于 2012-08-25T12:13:08.287 回答
0

它可能取决于Liskov 替换原则

因此,拥有A implements B意味着您可以AB需要时使用,并且要使其正常工作,A必须至少具有与B.

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

于 2012-08-25T11:58:54.933 回答
0

在实现一个接口时,我们可能不需要定义接口中声明的所有方法。我们可以定义一些我们不需要的方法,在主体内部什么都没有。

于 2015-01-23T08:50:06.047 回答