我应该密封所有我认为不应该用作基类的类吗?

问题描述:

即使没有切实的表现或安全考虑,我是否应该将我所知道的所有课程都封为基础类课程?我应该密封所有我认为不应该用作基类的类吗?

+0

[Somone说,我读到:](http://programmers.stackexchange.com/a/210481/4261)不要*封闭一个类,除非你知道*你会遇到支持问题你的客户。 – cregox 2013-09-04 19:29:20

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

所有这些都需要花费精力,而努力通常需要花费金钱。你花了谁的钱?他们可能会对是否应该执行此功能发表意见。

基本上,你有三种选择:

1)花的钱,让你有信心,这是正确的,稳健的,安全的,并满足用户的需求做功能。

2)不要做以上事情,但无论如何发布该功能,并希望运送未知的,未经检验的,未经检验的,未经证实的,未记录的,未知的安全风险未受到保护的功能不会损害您,您的雇主或您的客户。

3)密封班级。如果您发现(1)是正确的选择,请稍后解除密封。

我说(3)对于钱来说是物有所值的。我总是密封我写的每一堂课都不是为扩展而设计的。

+4

埃里克,这是一个问题给你。就像你必须声明一个方法'虚拟',然后才能覆盖它,为什么C#没有采用类似的东西来表明一个类可以被继承,并且默认情况下是封闭的。只是好奇。 – SolutionYogi 2010-01-29 22:11:14

+0

我会买这个。你认为C#类应该被默认密封吗? – 2010-01-29 22:18:13

+14

@Daniel,@SolutionYogi:我希望我们已经这么做了。不过,我其实是少数人,有很多人认为只有在有理由的情况下才能上课。我不同意;我想你只有在有理由这样做时才能开封课堂。 – 2010-01-29 22:32:51

是的。如果没有别的东西,这是一个让别人知道他们不应该走得更远的路标。

将类设置为sealed并不是垃圾,因为这样做会在代码中设置严格的规则:该类不能被继承。

如果代码不必要和令人困惑,那么代码只会被玷污。

也就是说,一个思想流派(以及简单的经验法则)是,您应该始终密封所有的课程,因为如果需要可以很容易地开封他们,但反之亦然。一些代码生成器自动执行此操作(见上面的Eric Lippert的选项#3,它基本上是这样说的。)

+1

就像几乎每个关于如何做事的答案一样,这取决于。 默认情况下可以通过密封类获得一些优化,并且只在需要时启封。 看看: http://msdn.microsoft.com/en-us/library/ms998547.aspx http://dotnetperls.com/sealed-1 – Firestrand 2010-01-29 19:07:34

我不认为它会加入cruft。相反,你清楚地表达了你对班级的意图。

类应设计为继承或密封。不幸的是,在C#中,默认情况下类不是封闭的,所以你必须自己包含关键字。就个人而言,我希望一个关键字能够明确地使类可用于继承,因为这会阻止人们使用类作为基类,除非它明确标记为这样。