接口除了实现多态和多重继承还有什么用处吗?

Do interfaces have any purpose besides achieving polymorphism and multiple inheritance?

我想了解使用接口的好处是什么,以便我知道何时以及如何使用它们。互联网上的大多数资源都是相对 surface-level,解释接口如何工作但现在为什么要使用它们,当我查找标题问题时,我没有得到任何结果告诉我接口的目的是否超出了多态性和多重继承。

我的理由是,如果一个接口只被一个class继承,那是没有用的,当一个接口被多个class继承时,没有什么区别,除非它是用于多态性,唯一使实现与扩展不同的是多重继承。

如果我确定他们的目的仅限于此,我就会对我的设计决策更有信心,如果我了解到除此之外的目的,它将填补我知识上的严重空白。我使用了设计模式标签,因为可能有一种设计模式以明显超越单纯的多态性或多重继承的方式使用接口。

假设您在谈论 language feature (e.g. interface keyword in Java), as opposed to the general computing term,接口的目的是多态性。

接口等工具可能会被滥用于其他目的,例如:

  • 作为一种交流共性的方式——这可能会适得其反,因为如果多态性不是设计的目标,那么声明实现接口的 classes 就没有必要了承诺执行它。当通用性最终被打破时,这可能不再相关,这可能发生,因为 classes 没有被多态使用。

  • 作为记录合同并允许 class 实现更改的一种方式 - 在 Java 中,这是通过 public/[=12= 实现的] 带有 Javadoc 的方法是记录合同的方式。有些语言甚至没有,他们仍然记录合同。当然,这仅在合同以函数调用的形式出现时才有效(与 RESTful HTTP API 相对),并且仅当您对记录的内容有规则时才有效,例如包装边界;你不想为每个 class 创建一个 interface,即使你为每个 class.

    记录合同
  • 从你的接口的消费者那里物理地隐藏东西——这也是关于记录合同,但是如果你的 class 有数据,或受保护的方法,并且你想阻止任何事情在您的包之外继承,您只能公开一个接口。但您也可以使用 final.

接口不是为实现多重继承而设计的;它们宁愿仅在对多态性有用的范围内促进多重继承;它实际上不允许您继承任何字段,直到最近 Java 使用默认方法(因此,不是 设计 ),甚至代码也不行。

你会看到,在野外,只有一个 class 实现接口的包。这不会使界面变得无用;将来可能会出现更多实现,事实上,该包可能希望允许调用者提供他们自己的实现。

if an interface were inherited by only one class, it would be useless

我同意,但您可以在 Java Interfaces Methodology: Should every class implement an interface?

中阅读有关此主题的大量讨论

when an interface is inherited by multiple classes, it makes no difference unless it is used for polymorphism

我同意,实现接口然后通过直接在具体 class 上调用其方法来绕过它是愚蠢的。实现接口的目的是调用其抽象方法,这就是多态性。由于多态性是面向对象编程的主要工具,您可以更进一步说 OOP 没有任何区别,除非它用于多态性.

the only thing that makes implementation different from extension is multiple inheritances

不,这些 Java 构造之间的主要区别在于接口实现促进了 stateless 继承,而 class 扩展促进了 stateful继承。 Java正好支持多无状态继承和单有状态继承。这种二分法可以被认为是mistake.

Do interfaces have any purpose besides achieving polymorphism and multiple inheritance?

实际上,是的。您可以找到用于其他目的的接口,例如 constant interfaces or marker interfaces。这些做法是否可取一直存在争议。