oop - 如何处理 "optional interfaces"?

标签 oop interface

“可选接口(interface)”可能不是一个标准术语,所以让我举个例子。假设我有:

interface Car {
  start();
  honk();
}

现在我可以拥有 HondaCarPriusCar 等实现。耶!但是,如果鸣喇叭对我或我的用户来说并不那么重要,那么我决定做这样的事情:

interface Car {
  start();
  canHonk(); // return true if honking is supported
  honk(); // undefined behavior of canHonk is false
}

这就是我所说的“可选接口(interface)”,因为实际上支持喇叭是可选的。它看起来仍然是一个很好的、定义良好的接口(interface),但表达这一点的另一种方式是将其分为两个接口(interface):

interface Car {
  start();
}

interface Honkable {
  honk();
}

现在,如果用户代码确实需要发出一些喇叭声,则必须向其传递 Honkable。如果它是可选的,它可以采用空指针。如果它根本不关心喇叭,它可以完全忽略 Honkable。然而,这确实给用户代码带来了更多的责任来管理这一切。

所以,我列出了我看到的一些优点和缺点,但我很好奇其他人的想法。在哪些情况下哪种模式是最佳模式?

最佳答案

组合优于继承,我们这里的主题,是一个重要的 OOP 原则。它告诉我们通过对象的功能来定义对象。这意味着,您的第二种方法是最佳实践。这样做:

public class SomeCar: ICar, IHonk {}

public Interface ICar {}

public Interface IHonk {}

Design for capability instead of identity.

关于oop - 如何处理 "optional interfaces"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49868992/

相关文章:

java - 基于输入的不同 validator

Java - 转换为接口(interface),然后找出转换的类型是什么

c# - 如何在C#中使用接口(interface)

c++ - 在 C++ 中静态地将用户输入获取到类中

java - 在不实现接口(interface)的情况下将对象分配给接口(interface)变量

java - 如何为接口(interface)的所有实现实现compareTo?

templates - 模板对象字段强制执行

python - 如何正确扩展 Python 中的其他类? ( python v3.3)

oop - Haskell中一个简单的面向对象类 'Point'

php - 关系数据库中的面向对象结构