可你曾经有太多的"保护虚拟"的方法吗?
题
这里有一个问题,对于那些与经验,在较大的项目和API/框架的设计。
我工作的一个框架,该框架将被用于许多其他项目在将来,所以我想让它好和可扩展,但同时也需要简单和易于理解。
我知道,很多人抱怨的.净框架包含了太多的密封类和私人成员。我应该避免这种批评和公开了我所有的类别有充足的保护虚拟的成员?
这是一个好的想法作为我的许多方法和属性 受保护的虚拟 可能吗?在什么情况下你会避免 受保护的虚拟 并让成员的私人。
解决方案
您类包括数据成员;关于这些数据成员,其中功能应该不会改变应该永远是私人执行基本的内部操作的方法。这样做的基本操作与您的数据成员,如初始化和分配方法应该是私有的。否则,你运行“二阶”衍生类获得一组不完整启用行为的风险;一阶导数的成员可以潜在地重新定义类的行为。
这一切说,我想你应该非常小心定义为“受保护的虚拟”的方法。我会在定义方法为“受保护的虚拟”使用非常谨慎,因为这样做不仅声明了重写功能,但在某些方面定义的期望的覆盖的可能性功能。这听起来好像是一个underdefined行为集合覆盖的;我宁愿有一个定义良好的行为来覆盖的。如果你想有一个非常大的一套覆盖的行为,我宁愿看着面向方面编程,允许类的事情在一个非常结构化的方式。
其他提示
在标记与所述虚拟字的方法,你允许用户改变时执行的逻辑块的方式。出于多种目的,这正是你想要的。我相信你已经知道了。
然而,类型应该被设计成用于这种扩展的。你必须积极地挑出来的方法,它是有道理的,让用户改变行为。如果你只是在虚拟拍遍你就有可能破坏类型的完整的地方,它并没有真正帮助用户理解的类型,你可能会引入一些漏洞,包括安全相关的问题。
我更喜欢保守的方法。我记住我的所有类与sealed
除非我特别希望能够继承和那些(少数)情况下,我只能让所需的方法是虚拟的。
这是很容易如果类需要改变,以允许继承在未来以除去sealed
标签。但是,如果你想改变一个类,它已被用来作为一个基类为一些其他类型的,你就有可能打破了子类时,你改变的基类。
我的观点是:
- 如果你能用户
events
, 其首选protected
方法。 - 尽量避免
protected
方法成为可能,如果不可能那么你必须要使用它;-).
选择protected
超过private
是故意设计决定。就表示你的类明确支持有使用该功能,所有附带的开销(设计和实施工作)。我只会用protected
在这些情况下,我知道,这是必要的,这主要是因为我在做我自己。 (您还可以找到来自沿着相同的路线为我所说的BCL开发者的意见。)
在virtual
/非virtual
性能差异是任何机器是强大到足以运行.NET框架上不相关的。
没有,你不能有“太多了。”然而,这个想法是我们应该尽最大的保护,而不是私人或避免“密封”不惜一切代价仅仅是愚蠢的。我会保持“辅助方法”和内部数据结构私有。