注释
此内容由 Pearson Education, Inc. 的许可从 框架设计指南:可重用 .NET 库的约定、习惯和模式(第 2 版)重新打印。 该版于2008年出版,此后该书已于 第三版全面修订。 此页上的一些信息可能已过期。
可替代虚拟成员,从而更改子类的行为。 它们在提供的扩展性方面与回调非常相似,但它们在执行性能和内存消耗方面更好。 此外,在需要创建一种特殊的现有类型(专用化)的场景中,虚拟成员感觉更自然。
虚拟成员的性能优于回调和事件,但不优于非虚拟方法。
虚拟成员的主要缺点是,虚拟成员的行为只能在编译时修改。 可以在运行时修改回调的行为。
与回调(可能不止回调)一样,虚拟成员的设计、测试和维护成本很高,因为对虚拟成员的任何调用都可能以不可预测的方式被替代,并可能执行任意代码。 此外,通常需要付出更多的努力来明确定义虚拟成员的协定,因此设计和记录它们的成本更高。
❌ 请勿使成员成为虚拟成员,除非有充分的理由这样做,并且你了解与设计、测试和维护虚拟成员相关的所有成本。
在不破坏兼容性的情况下,虚拟成员对可对其进行的更改不太宽容。 此外,它们比非虚拟成员慢,主要是因为对虚拟成员的调用没有内联。
✔️ 请考虑将扩展性限制在绝对必要的范围内。
✔️ 对于虚拟成员,宜选择受保护的访问级别,而不是公共访问级别。 公共成员应通过调用受保护的虚拟成员提供扩展性(如需要)。
类的公共成员应为该类的直接使用者提供正确的功能集。 虚拟成员设计为在子类中被替代,而受保护的可访问性是将所有虚拟扩展点的范围限定在可使用这些扩展点的位置的好方法。
部分内容 © 2005, 2009 Microsoft 公司。 保留所有权利。
获得皮尔逊教育公司许可后重印自 框架设计准则:可重用 .NET 库的约定、习惯和模式 ,由 Krzysztof Cwalina 和 Brad Abrams 编写,并作为微软 Windows 开发系列中的出版物之一,于 2008 年 10 月 22 日由 Addison-Wesley Professional 出版。