我应该密封我知道不应该用作基类的所有类吗?

Dan*_*man 49 c# coding-style class sealed

我是否应该密封我知道的所有课程,即使没有明显的性能或安全问题,也不应该将其作为基类,或者这只是增加了什么?

Eri*_*ert 50

一个可扩展的类实现了它可以扩展的特性 - 这是一个类似于类的任何其他特性的特性,应该被视为一个,与方法没有区别.应仔细考虑所有功能,以确保它们使用该功能满足客户的目标.需要针对安全问题设计,实施,审查功能,调试,记录和维护.

所有这些都需要付出努力,而努力通常需要花钱.你花了多少钱?他们可能会对您是否应该执行此功能有意见.

基本上,您有三种选择:

1)花钱去做这个功能,这样你就可以确信它是正确的,健壮的,安全的并满足用户需求.

2)不执行上述任何操作,但无论如何都要运送该功能,并希望运送未经授权,快速实施,未经测试,未记录,未维护的未知安全风险的功能不会对您,您的雇主或您的客户造成损害.

3)密封课程.如果您发现(1)是正确的选择,请稍后开封.

我说(3)这笔钱很有价值.我总是密封我写的每个不是为了扩展性而设计的类.

  • @Daniel,@ SolutionYogi:我希望我们已经这样做了.但是,我实际上是少数; 有很多人认为,只有在你有理由这样做的时候才应该上课.我不同意; 我认为只有在你有理由这样做时才应该开封课程. (17认同)
  • 埃里克,这是给你的问题.就像你必须在覆盖它之前声明方法'virtual'一样,为什么C#没有采用类似的东西来表明一个类可以被继承并默认密封它.只是好奇. (4认同)
  • @Daniel:因为我觉得它太棒了.(如果您使用RSS阅读器阅读博客,那么您将获得未格式化的内容.) (4认同)
  • @SunnyMilenov:他们所指的博客文章是:http://blogs.msdn.com/b/ericlippert/archive/2004/01/22/61803.aspx.Jeff Atwood所提到的博客文章是:http://www.codinghorror.com/blog/2006/12/eric-lipperts-purple-crayon.html.我对杰夫的回应是:http://blogs.msdn.com/b/ericlippert/archive/2007/01/08/the-horror-the-horror.aspx.可悲的是,响应不再是紫色lucida.不是很讽刺,你不觉得吗? (3认同)

Pau*_*sik 12

设置一个类sealed是不可能的,因为这样做会在代码中设置一个严格的规则:这个类不能被继承.

如果代码不必要且令人困惑,那么代码就是残缺的.

也就是说,一种思想流派(和简单的经验法则)是你应该始终密封所有类别,因为如果有必要,它们很容易开封,但反之亦然.一些代码生成器自动执行此操作 (参见Eric Lippert上面的选项#3.基本上说同样的事情.)


Bri*_*sen 7

我不认为它会增加任何瑕疵.相反,你清楚地表达了你对课程的意图.

类应设计为继承或密封.不幸的是,在C#中默认情况下不会对类进行密封,因此您必须自己包含关键字.就个人而言,我更倾向于使用关键字来明确地使类可用于继承,因为这会阻止人们将类用作基类,除非它被明确标记为这样.


Not*_*tMe 5

是.如果不出意外,它就是一个路标,让其他人知道他们不应该走得太远.