32

我只是想知道,既然密封关键字的存在表明它是类作者的决定,是否允许其他类从它继承,为什么默认情况下不密封类,用一些关键字将它们显式标记为可扩展?

我知道这有些不同,但访问修饰符以这种方式工作。默认设置是限制性的,只有插入关键字才能授予更全面的访问权限。

不过,我很有可能没有正确考虑到这一点,所以请保持人道!

4

9 回答 9

45

我会说这只是一个错误。我认识很多人(包括我自己)认为课程确实应该默认密封。那个阵营的 C# 设计团队中至少有几个人。自从 C# 最初设计以来,钟摆已经在某种程度上偏离了继承。(当然,它有它的位置,但我发现自己很少使用它。)

对于它的价值,这并不是与 Java 太接近的唯一错误:我个人宁愿 Equals 和 GetHashCode 不在对象中,并且您也需要特定的 Monitor 实例来锁定......

于 2008-10-31T06:26:29.387 回答
33

在我看来,不应该有默认语法,这样你总是可以明确地写出你想要的东西。这迫使编码人员理解/思考更多。

如果你想让一个类是可继承的,那么你写

public extensible class MyClass

除此以外

public sealed class MyClass

顺便说一句,我认为访问修饰符也应该如此,不允许默认访问修饰符。

于 2008-10-31T06:37:07.463 回答
13

继承是 OO 的基本原则,因此可以说,默认情况下不允许它是不直观的。

于 2008-10-31T00:44:53.070 回答
4

您可能会提出尽可能多的论点来支持默认密封,因为您可以反对它。如果反过来,就会有人发布相反的问题。

于 2008-10-31T02:35:23.473 回答
3

我不记得听说过默认情况下不密封类的决定的理由。但是,肯定有不少人认为 C# 应该被指定为默认密封:

http://codebetter.com/blogs/patricksmacchia/archive/2008/01/05/rambling-on-the-sealed-keyword.aspx

于 2008-10-31T00:45:52.057 回答
3

密封类防止继承,因此是一种面向对象的厌恶。有关详细信息,请参阅此咆哮;-)

于 2008-10-31T00:52:35.067 回答
3

仅仅从一个未密封的类派生不会改变类的行为。可能发生的最坏情况是基类的新版本将添加一个与派生类同名的成员(在这种情况下,只会出现一个编译器警告,提示您应该使用newoverride修饰符)或基类类是密封的(如果该类已经被释放到野外,这是一个设计禁忌)。任意子类化仍然符合Liskov 替换原则

在 C# 中默认情况下成员不可重写的原因是因为重写方法可以以基类作者未预料到的方式更改基类的行为。通过使其明确抽象或虚拟,意味着作者意识到它可以改变或超出他们的控制范围,作者应该考虑到这一点。

于 2008-10-31T02:56:54.427 回答
3

Word 的 80% 的功能未被使用。80% 的类不会被继承。在这两种情况下,偶尔会有人出现并想要使用或重用某个功能。为什么原设计者要禁止重复使用?让重用者决定他们想要重用什么。

于 2008-10-31T07:12:41.823 回答
-1

出于同样的原因,默认情况下对象不是私有的

或者

与对象类比一致,即对象默认不是私有的

只是猜测,因为归根结底这是一种语言的设计决定,而创作者所说的是佳能材料。

于 2008-10-31T07:53:40.960 回答