6

为什么抽象类不能是密封的或静态的?

我也对为什么在 C# 中将静态类声明为密封和抽象的问题感到困惑?.

4

2 回答 2

21
  1. static类不能被标记sealed,因为它是sealed由编译器默认生成的。

    静态类是密封的,因此不能被继承。

  2. static类不能标记为abstract,因为它没有意义。abstract当您希望所有派生类实现逻辑的相同部分时,类才有意义。但是因为static类不能派生,所以其他类无法实现这些差距。

    它们不能从任何类继承,除了Object.

都引用了静态类和静态类成员(C# 编程指南)

C# 规范对此有更详细的说明:

10.1.1.3 静态类

一个static类可能不包含sealedorabstract修饰符。但是请注意,由于一个static类不能被实例化或派生,它的行为就好像它同时是sealedand一样abstract

sealed您可以阅读 class to be or的含义abstract

抽象类不能直接实例化,在抽象类上使用new操作符是编译时错误

密封修饰符用于防止从类派生。如果将密封类指定为另一个类的基类,则会发生编译时错误。

更新

关于您提到的查询中链接的一篇文章(静态类设计)。已在该问题的已接受答案中说明了这一点。如果你仔细阅读,你会发现:

如果您的编程语言没有对静态类的内置支持,请务必将类声明staticsealedabstract并添加private实例构造函数。

.NET(所以 C# 也是如此)确实具有对静态类的内置支持,因此您没有(甚至不能)通过同时标记sealedabstract.

于 2014-01-07T06:55:28.847 回答
0

首先,让我们从一个定义开始;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; }
        ...
    }
}

因为密封类不能被继承,所以不能用作基类,因此抽象类不能使用密封修饰符。

同样重要的是要提到结构是隐式密封的。

于 2020-02-25T15:07:36.860 回答