接口对必须由实现者所提供的成员集合的签名进行定义。接口不能够为成员提供实现的细节。例如,ICollection 接口定义了与集合操作相关的成员。实现了接口的每一个类都必须为这些成员提供实现细节。并且一个类能够实现多个接口。
类既定义了成员签名也为每个成员定义了实现细节。抽象(在 Visual Basic 中是 MustInherit)类能够拥有与定义成员的接口或常规类一样的行为,虽然它们仍然能够提供具体的实现细节,但是这不是必需的,而继承自抽象类的具体类则不需要提供必需的实现。
抽象类和接口分别从实现中支持不同的约定,接口不能够在后续版本中指定新的成员,而抽象类则能够按照需要随意地添加成员来支持附加的功能。
赞成在接口之上定义类进。
在类的后续版本中,你可以安全地把新的成员添加到类中;但是你无法在不破坏现有代码的情况之下把成员添加到接口中。
使用抽象(在 Visual Basic 中是 MustInherit)类来替代接口以减少来自于实现的约定。
如果你需要为值类型提供一个多态层次的时候,就需要定义一个接口。
值类型必须继承自 ValueType,并且只能够继承自 ValueType,因此它们不能够通过类来对约定以及实现进行分离。在这种情况下,如果你的值类型需要多态的行为,你就必须使用一个接口。
考虑定义接口来完成一个与多重继承相类似的效果。
如果一个类型必须实现多个约定,或者约定可以适用于多种类型,那么就可以使用接口。例如,IDisposable 就是通过在多个不同的情节中被使用的类型而被实现的。要求类从一个能够被处理的基类那里进行继承的做法将会导致这个类的层次过于僵硬。例如,MemoryStream 类将会对基于父类的数据流约定进行继承,但是它不能这样做并且同时也是可处理的。