“可选接口(interface)”可能不是一个标准术语,所以让我举个例子。假设我有:
interface Car {
start();
honk();
}
现在我可以拥有 HondaCar
、PriusCar
等实现。耶!但是,如果鸣喇叭对我或我的用户来说并不那么重要,那么我决定做这样的事情:
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/