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

时间:2014-01-07 06:51:56

标签: c# abstract-class static-classes sealed

为什么抽象类不能被密封或静态? 我也对这个问题Why declare static classes as sealed and abstract in C#?

感到困惑

2 个答案:

答案 0 :(得分:12)

  1. static类无法标记为sealed,因为默认情况下它由编译器生成sealed

      

    静态类是密封的,因此无法继承。

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

      

    Object之外,它们不能继承任何类。

  3. 两个引自Static Classes and Static Class Members (C# Programming Guide)

    C#规范更详细一点:

      

    10.1.1.3静态类

         

    static课程可能不包含sealedabstract修饰符。但请注意,由于static类无法实例化或派生自,因此它的行为就像sealedabstract一样。

    您可以阅读课程sealedabstract的含义:

      

    抽象类无法直接实例化,在抽象类上使用new运算符是编译时错误

      

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

    <强>更新

    关于您提到的查询中链接的文章(Static Class Design)。已经在该问题的接受答案中说明了这一点。如果你仔细阅读,你可以看到:

      

    DO static类声明为sealedabstract,并添加private实例构造函数,如果您的编程语言是没有内置的静态类支持

    .NET(所以也是C#)确实内置了对静态类的支持,所以你没有(甚至不能)通过标记来创建你的类伪静态sealedabstract

答案 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; }
        ...
    }
}

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

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