注释
此内容由 Pearson Education, Inc. 的许可从 框架设计指南:可重用 .NET 库的约定、习惯和模式(第 2 版)重新打印。 该版于2008年出版,此后该书已于 第三版全面修订。 此页上的一些信息可能已过期。
尽管大多数 API 最好使用类和结构进行建模,但在某些情况下,接口更合适或是唯一的选择。
CLR 不支持多个继承(即 CLR 类不能从多个基类继承),但它允许类型实现一个或多个接口,以及从基类继承。 因此,接口通常用于实现多个继承的效果。 例如,IDisposable 是一个接口,该接口允许类型独立于它们要参与的任何其他继承层次结构来支持可处置性。
定义接口的另一种情况是创建可由多种类型(包括某些值类型)支持的通用接口。 值类型不能继承自其他 ValueType类型,但它们可以实现接口,因此使用接口是唯一一种提供通用基类型的选项。
✔️ 如果需要一组包含值类型的类型支持一些常见 API,请定义接口。
✔️ 如果需要在已从其他类型继承的类型上支持功能,请考虑定义接口。
❌ 避免使用标记接口(没有成员的接口)。
如果需要将类标记为具有特定特征(标记),一般情况下,请使用自定义属性而不是接口。
✔️ 请至少提供一种类型,该类型是接口的实现。
这样做有助于验证接口的设计。 例如,List<T> 是 IList<T> 接口的一个实现。
✔️ 请至少提供一个 API 来供每个你定义的接口使用(可以是一个以接口为参数的方法,或者一个类型为接口的属性)。
这样做有助于验证接口设计。 例如,List<T>.Sort 使用 System.Collections.Generic.IComparer<T> 接口。
❌ 请勿将成员添加到之前已提供的接口。
这样做会破坏接口的实现。 应创建新的接口以避免版本控制问题。
除了这些准则中所述的情况外,通常应该选择类而不是设计托管代码可重用库的接口。
部分内容 © 2005, 2009 Microsoft 公司。 保留所有权利。
获得皮尔逊教育公司许可后重印自 框架设计准则:可重用 .NET 库的约定、习惯和模式 ,由 Krzysztof Cwalina 和 Brad Abrams 编写,并作为微软 Windows 开发系列中的出版物之一,于 2008 年 10 月 22 日由 Addison-Wesley Professional 出版。