为什么抽象类不能是密封的或静态的?
我还对为什么在C#中将静态类声明为密封和抽象的问题感到困惑。
-
static
类不能标记为sealed
,因为默认情况下编译器会将其设置为sealed
。静态类是密封的,因此不能继承。
-
static
类不能标记为abstract
,因为这将毫无意义。当您希望所有派生类实现逻辑的同一部分时,abstract
类是有意义的。但由于static
类不能派生,所以其他类不可能实现这些间隙。它们不能从除
Object
之外的任何类继承。
引用静态类和静态类成员(C#编程指南)。
C#规范对此有点详细:
110.1.1.3静态类
static
类可以不包括sealed
或abstract
修饰符。然而,请注意,由于static
类不能实例化或从中派生,因此它的行为就好像它既是sealed
又是abstract
。
您可以阅读类为sealed
或abstract
:意味着什么
抽象类不能直接实例化,在抽象类上使用新运算符是编译时错误
密封修饰符用于防止从类派生。如果将密封类指定为另一个类的基类,则会发生编译时错误。
更新
还有一个关于你提到的查询中链接的文章的词(静态类设计)。这个问题的公认答案已经说明了。如果你仔细阅读,你可以看到:
√DO将
static
类声明为sealed
、abstract
,如果您的编程语言没有内置的静态类支持,则添加一个private
实例构造函数。
.NET(C#也是如此)确实内置了对静态类的支持,因此您不必(甚至不能)通过将类标记为sealed
和abstract
来使其成为伪静态。