我有点将接口理解为可以应用于没有共同点的类的合同(例如:Java 中的 Comparable)。但是,在什么情况下,您会有在设计阶段添加界面的反射?
3 回答
每当您使用静态类型语言时,并且您希望开发人员可以在提供替代实现的同时使用您的代码 - 换句话说,在这种语言中,有必要实现低(er)耦合。
通常使用鸭子类型而不是严格类型检查的语言,例如 python,通常不需要接口。
“我有点将接口理解为一种契约,它可以应用于本来没有任何共同点的类”——这可能不是思考接口是什么的方式。
接口描述行为,实现接口意味着类进入契约以交付该行为。
通过对接口而不是实现进行编程,您可以启用多态性并获得更灵活且耦合度更低的代码。例如,此方法可以采用任何实现的实例IQuack
:
public void DoSomething(IQuack quacker)
{
// ...
}
如果您正在设计一个产品,并且您知道该产品将与一种设备、服务等进行交互,但不一定是哪种,您可以使用界面来推进整体架构,前提是您对这些类型有足够的了解设备来编写一个接口,该接口可以被该类型的任何给定设备成功使用。当然,如果您处于设计阶段,您最好掌握这些知识。仅使用接口声明进行高级设计并不少见。我并不是说它是好是坏,但这似乎是那些使用软件(如 Rose 等)从 UML 生成骨架的人的一种非常普遍的做法。
另一种情况是,如果您确切知道要使用什么设备,但您认为将来可能需要使用不同或多种类型的设备。
接口的第三种用途是减少重复代码。这可能是人们唯一对界面使用着迷的地方,如果不是因为这样,我会很自在地说不要问“这应该是一个界面吗?” 但是“这可以是一个接口吗?”。