您的课程包括数据成员; 对那些功能永远不会改变的数据成员执行基本内部操作的方法应该始终是私有的.因此,对数据成员执行基本操作的方法(如初始化和分配)应该是私有的.否则,您将面临"二阶"派生类获得一组不完整行为的风险; 一阶导数成员可能会重新定义该类的行为.
总而言之,我认为你应该非常小心地将方法定义为"受保护的虚拟".在将方法定义为"受保护的虚拟"时,我会非常谨慎,因为这样做不仅声明了覆盖功能的可能性,而且在某些方面定义了对被覆盖的功能的期望.这听起来像是一个未定义的行为要覆盖; 我宁愿有一套定义明确的行为来覆盖.如果你想拥有一大堆可覆盖的行为,我宁愿研究面向方面的编程,它允许以非常结构化的方式进行这种事情.
当您使用单词virtual标记方法时,您允许用户更改执行逻辑的方式.出于许多目的,这正是您想要的.我相信你已经知道了.
但是,应该为这种扩展设计类型.您必须主动选择方法,让用户改变行为是有意义的.如果您只是在整个虚拟区域上进行虚拟操作,则可能会破坏该类型的完整性,但这并不能帮助用户理解该类型,并且您可能会引入一些错误,包括与安全相关的问题.
我更喜欢保守的做法.我标记了我的所有类,sealed除非我特别想要启用继承,在那些(少数)情况下我只将所需的方法设为虚拟.
sealed如果类需要更改以允许将来继承,则很容易删除标记.但是,如果要更改已用作某些其他类型的基类的类,则在更改基类时可能会破坏子类.
| 归档时间: |
|
| 查看次数: |
7822 次 |
| 最近记录: |