我只是想知道,既然sealed关键字的存在表明这是类作者决定其他类是否允许从它继承的决定,为什么不将类默认设置为sealed,必要时使用关键字标记为可扩展呢?
虽然访问修饰符略有不同,但也是采用了这种方式。默认情况下访问受限,只有在插入关键字后才能获得更多的访问权限。
虽然我很可能没有认真思考过这个问题,所以请多包容!
我只是想知道,既然sealed关键字的存在表明这是类作者决定其他类是否允许从它继承的决定,为什么不将类默认设置为sealed,必要时使用关键字标记为可扩展呢?
虽然访问修饰符略有不同,但也是采用了这种方式。默认情况下访问受限,只有在插入关键字后才能获得更多的访问权限。
虽然我很可能没有认真思考过这个问题,所以请多包容!
我认为那只是个错误。我知道很多人(包括我自己)认为类应该默认为sealed。C#设计团队中至少有几个人持这种观点。自从C#首次设计以来,继承已经逐渐被较少使用了。(当然,它也有其适用的地方,但我发现我相对较少使用它。)
说句题外话,这并不是太接近Java的唯一错误:就我个人而言,我宁愿Equals和GetHashCode不在object里面,并且锁定时需要特定的Monitor实例。
我认为,不应有默认语法,这样你总是要明确写出你想要的东西。这迫使编码者更加理解思考。
如果您希望一个类可以继承,则需要编写:
public extensible class MyClass
否则
public sealed class MyClass
顺便说一句,我认为访问修饰符也应该如此,禁止使用默认的访问修饰符。
public class MyClass
。 - cregox继承是面向对象编程的基本原则,因此,从默认情况下禁止它可能并不直观。
对于默认启用密封机制和默认禁用密封机制各有利弊。如果情况相反,那么就会有人发表相反的观点。
sealed classes(密封类)禁止继承,因此是面向对象编程中的一种反模式。详见此篇文章。
Form
是设计用于扩展的,这也是这场辩论的全部意义。你和我都认为,应该努力设计可扩展的代码,然而经验证明,太多人不这样做。因此,将一个类密封或不密封在理论上没有区别;那些类不能被扩展,因为它们没有被设计成可扩展的,就是这样。唯一的实际区别是,在一个情况下是显而易见和明确(密封),而在另一个情况下,当它在运行时崩溃时你会发现它。 - tneWord 的 80% 功能被闲置了。 80% 的类没有被继承。 在这两种情况下,间或会有人想使用或重复使用某个功能。 为什么原始设计者要禁止重复使用呢? 让重复使用者自己决定他们想要重复使用什么。