为什么默认情况下没有密封课程?

时间:2008-10-31 00:38:58

标签: c# inheritance sealed

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

我知道它有些不同,但访问修饰符以这种方式工作。默认情况下是限制性的,只有通过插入关键字才能获得更全面的访问权限。

尽管如此,我很可能没有想到这一点,所以请保持人性化!

9 个答案:

答案 0 :(得分:41)

我说这只是一个错误。我知道许多人(包括我自己)认为课程确实应该默认密封。该阵营的C#设计团队中至少有几个人。自从C#首次设计以来,钟摆摆脱了遗传。 (当然,它有它的位置,但我发现自己很少使用它。)

对于它的价值,这不是唯一的错误,因为它过于接近Java:我个人而不是Equals和GetHashCode不在对象中,并且你需要特定的Monitor实例来锁定...

答案 1 :(得分:29)

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

如果您希望某个类可以继承,那么您可以编写

public extensible class MyClass

,否则

public sealed class MyClass

BTW我认为访问修饰符也应该这样,不允许使用默认访问修饰符。

答案 2 :(得分:15)

我看到两个简单的原因:

  1. 继承是OO的基本原则,因此默认情况下不允许它是不直观的。
  2. 大多数类都设计为允许继承,因此默认允许继承可以节省输入。

答案 3 :(得分:4)

你可以做出尽可能多的支持默认密封的论据,因为你可以反对它。如果是相反的话,有人会发布相反的问题。

答案 4 :(得分:3)

我不记得曾经听过有关决定默认没有密封课程的理由。然而,肯定有不少人认为C#应该被指定为密封默认值:

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

答案 5 :(得分:3)

密封类阻止继承,因此是OO abombination。有关详细信息,请参阅this rant; - )

答案 6 :(得分:3)

仅仅从未密封的类派生并不会改变类的行为。最糟糕的情况是基类的新版本将添加一个与派生类同名的成员(在这种情况下,只会有编译器警告说你应该使用 new 覆盖修饰符)或基类被密封(如果该类已经被释放到野外,这是一个设计禁止 - 否)。任意子类仍然符合Liskov Substitution Principle

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

答案 7 :(得分:3)

Word的80%功能未使用。 80%的课程都没有继承自。在这两种情况下,偶尔会有人出现并希望使用或重复使用某项功能。原设计师为什么要禁止重复使用?让reuser决定他们想要重用的内容。

答案 8 :(得分:0)

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

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

只是猜测,当天结束时,这是一种语言的设计决定,而创作者所说的是佳能材料。