为什么抽象类不能被密封或静态? 我也对这个问题Why declare static classes as sealed and abstract in C#?
感到困惑答案 0 :(得分:12)
static
类无法标记为sealed
,因为默认情况下它由编译器生成sealed
。
静态类是密封的,因此无法继承。
static
类不能标记为abstract
,因为它毫无意义。当您希望所有派生类实现逻辑的相同部分时,abstract
类是有意义的。但由于无法导出static
类,因此其他类无法实现这些差距。
除
Object
之外,它们不能继承任何类。
两个引自Static Classes and Static Class Members (C# Programming Guide)。
C#规范更详细一点:
10.1.1.3静态类
static
课程可能不包含sealed
或abstract
修饰符。但请注意,由于static
类无法实例化或派生自,因此它的行为就像sealed
和abstract
一样。
您可以阅读课程sealed
或abstract
的含义:
抽象类无法直接实例化,在抽象类上使用new运算符是编译时错误
sealed修饰符用于防止从类中派生。如果将密封类指定为另一个类的基类,则会发生编译时错误。
<强>更新强>
关于您提到的查询中链接的文章(Static Class Design)。已经在该问题的接受答案中说明了这一点。如果你仔细阅读,你可以看到:
√ DO 将
static
类声明为sealed
,abstract
,并添加private
实例构造函数,如果您的编程语言是没有内置的静态类支持。
.NET(所以也是C#)确实内置了对静态类的支持,所以你没有(甚至不能)通过标记来创建你的类伪静态它sealed
和abstract
。
答案 1 :(得分:0)
首先,让我们从定义开始。密封是一个修饰符,如果将其应用于类使其不可继承,并且如果将其应用于虚拟方法或属性将使其变为不可遍历。
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; }
...
}
}
因为不能继承密封的类,所以不能将其用作基类,因此抽象类也不能使用密封的修饰符。
同样重要的是要提到结构是隐式密封的。