为什么抽象类不能是密封的或静态的?
2 回答
static
类不能被标记sealed
,因为它是sealed
由编译器默认生成的。静态类是密封的,因此不能被继承。
static
类不能标记为abstract
,因为它没有意义。abstract
当您希望所有派生类实现逻辑的相同部分时,类才有意义。但是因为static
类不能派生,所以其他类无法实现这些差距。它们不能从任何类继承,除了
Object
.
都引用了静态类和静态类成员(C# 编程指南)。
C# 规范对此有更详细的说明:
10.1.1.3 静态类
一个
static
类可能不包含sealed
orabstract
修饰符。但是请注意,由于一个static
类不能被实例化或派生,它的行为就好像它同时是sealed
and一样abstract
。
sealed
您可以阅读 class to be or的含义abstract
:
抽象类不能直接实例化,在抽象类上使用new操作符是编译时错误
密封修饰符用于防止从类派生。如果将密封类指定为另一个类的基类,则会发生编译时错误。
更新
关于您提到的查询中链接的一篇文章(静态类设计)。已在该问题的已接受答案中说明了这一点。如果你仔细阅读,你会发现:
√如果您的编程语言没有对静态类的内置支持,请务必将类声明
static
为sealed
、abstract
并添加private
实例构造函数。
.NET(所以 C# 也是如此)确实具有对静态类的内置支持,因此您没有(甚至不能)通过同时标记sealed
和abstract
.
首先,让我们从一个定义开始;sealed 是一个修饰符,如果应用于类,则使其不可继承,如果应用于虚拟方法或属性,则使其不可覆盖。
public sealed class A { ... }
public class B
{
...
public sealed string Property { get; set; }
public sealed void Method() { ... }
}
其用法的一个示例是定义一个专门的类/方法或属性,其中潜在的更改可能会使它们停止按预期工作(例如,System.Drawing命名空间的 Pens 类)。
...
namespace System.Drawing
{
//
// Summary:
// Pens for all the standard colors. This class cannot be inherited.
public sealed class Pens
{
public static Pen Transparent { get; }
public static Pen Orchid { get; }
public static Pen OrangeRed { get; }
...
}
}
因为密封类不能被继承,所以不能用作基类,因此抽象类不能使用密封修饰符。
同样重要的是要提到结构是隐式密封的。