繁体   English   中英

为什么默认情况下不密封类?

[英]Why aren't classes sealed by default?

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

我知道这有点不同,但访问修饰符是这样工作的。 默认情况下是限制性的,只有插入关键字才能授予更全面的访问权限。

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

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

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

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

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

public extensible class MyClass

除此以外

public sealed class MyClass

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

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

您可能会提出尽可能多的支持默认密封的论据。 如果反过来,有人会发布相反的问题。

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

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

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

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

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

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

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

或者

与对象模拟一致,默认情况下对象不是私有的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM