注释
此内容由 Pearson Education, Inc. 的许可从 框架设计指南:可重用 .NET 库的约定、习惯和模式(第 2 版)重新打印。 该版于2008年出版,此后该书已于 第三版全面修订。 此页上的一些信息可能已过期。
严格地说,当另一个类派生自基类时,类将成为基类。 但是,出于本部分的目的,基类是一个类,主要设计为提供通用抽象或其他类,以便在继承时重复使用某些默认实现。 基类通常位于继承层次结构的中间,位于层次结构根的抽象和底部的多个自定义实现之间。
它们充当实现抽象的辅助工具。 例如,框架用于有序项集合的抽象之一是 IList<T> 接口。 实现IList<T>并不简单,因此框架提供了多个基类,例如Collection<T>KeyedCollection<TKey,TItem>,它们充当实现自定义集合的帮助程序。
基类通常不适合作为抽象本身,因为它们往往包含太多的实现。 例如, Collection<T>
基类包含许多与它实现非泛型接口(以便更好地与非泛 IList
型集合集成)以及它是存储在其中一个字段中的内存中的项的集合相关的大量实现。
如前所述,基类可以为需要实现抽象的用户提供宝贵的帮助,但同时它们可能是一项重大责任。 它们增加表面积并加深继承层次结构,因此在概念上使框架更加复杂。 因此,仅当基类为框架的用户提供重要价值时,才应使用基类。 如果只向框架的实现者提供价值,则应避免它们,在这种情况下,应强烈考虑委托内部实现而不是从基类继承。
✔️ 考虑使基类抽象,即使它们不包含任何抽象成员。 这清楚地向用户传达了该类专门为从其继承而设计。
✔️ 请考虑将基类放置在独立于主线方案类型的命名空间中。 根据定义,基类适用于高级扩展性方案,因此对大多数用户并不感兴趣。
❌ 如果类用于公共 API,则避免使用“Base”后缀命名基类。
部分内容 © 2005, 2009 Microsoft 公司。 保留所有权利。
获得皮尔逊教育公司许可后重印自 框架设计准则:可重用 .NET 库的约定、习惯和模式 ,由 Krzysztof Cwalina 和 Brad Abrams 编写,并作为微软 Windows 开发系列中的出版物之一,于 2008 年 10 月 22 日由 Addison-Wesley Professional 出版。