注释
此内容由 Pearson Education, Inc. 的许可从 框架设计指南:可重用 .NET 库的约定、习惯和模式(第 2 版)重新打印。 该版于2008年出版,此后该书已于 第三版全面修订。 此页上的一些信息可能已过期。
抽象是描述协定但不提供协定的完整实现的类型。 抽象通常作为抽象类或接口实现,它们附带了一组定义完善的参考文档,描述实现协定的类型所需的语义。 .NET Framework 中的一些最重要的抽象包括Stream和IEnumerable<T>Object。
你可实现支持抽象协定的具体类型并将此具体类型与使用该抽象的(针对该抽象操作的)框架 API 结合使用,从而扩展框架。
能够承受时间测试的有意义且有用的抽象很难进行设计。 主要难点是获得正确的成员集,不能多也不能少。 如果抽象具有过多的成员,则很难甚至不可能实现。 如果它的成员数量不足以实现承诺的功能,那么在许多有趣的情境中,它就变得无用了。
框架中的抽象过多也会对框架的可用性产生负面影响。 通常,如果不了解抽象如何融入具体实现及其上运行的 API 所在的整体背景,就很难理解抽象。 此外,抽象的名称及其成员必然是抽象的,这通常使它们显得晦涩难懂,除非首先理解它们使用的更广泛背景。
不过,抽象提供极其强大的扩展性,这是其他扩展性机制所不能比拟的。 它们是许多体系结构模式的核心,例如插件、控制反转(IoC)、管道等。 它们对于框架的可测试性也非常重要。 良好的抽象使你可以出于单元测试的目的,剔除大量的依赖项。 总之,抽象是现代面向对象框架备受追捧的丰富性的原因。
❌ 请勿提供抽象,除非通过开发使用抽象的多个具体实现和 API 对其进行测试。
✔️ 设计抽象类时,务必在抽象类和接口之间进行仔细选择。
✔️ 请考虑为抽象的具体实现提供参考测试。 此类测试应允许用户测试其实现是否正确实现协定。
部分内容 © 2005, 2009 Microsoft 公司。 保留所有权利。
获得皮尔逊教育公司许可后重印自 框架设计准则:可重用 .NET 库的约定、习惯和模式 ,由 Krzysztof Cwalina 和 Brad Abrams 编写,并作为微软 Windows 开发系列中的出版物之一,于 2008 年 10 月 22 日由 Addison-Wesley Professional 出版。