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

C# 为什么抽象类不能是密封的或静态的?,c#,abstract-class,static-classes,sealed,C#,Abstract Class,Static Classes,Sealed,为什么抽象类不能是密封的或静态的? 我也对这个问题感到困惑 静态类无法标记为密封,因为默认情况下编译器将其制作为密封 静态类是密封的,因此无法继承 静态类不能标记为抽象,因为它将毫无意义抽象类是有意义的。但是,因为不能派生出静态类类,所以其他类无法实现这些间隙 它们不能从除对象以外的任何类继承 这两段话都是引用自 C#规范对此更为详细: 10.1.1.3静态类 静态类不能包含密封或抽象修饰符。但是,请注意,由于不能实例化或派生静态类,因此它的行为就像是密封的和抽象的 您可以阅读类被密封或抽象

为什么抽象类不能是密封的或静态的? 我也对这个问题感到困惑

  • 静态
    类无法标记为
    密封
    ,因为默认情况下编译器将其制作为
    密封

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

  • 静态
    类不能标记为
    抽象
    ,因为它将毫无意义<当您希望所有派生类实现逻辑的同一部分时,代码>抽象类是有意义的。但是,因为不能派生出
    静态类
    类,所以其他类无法实现这些间隙

    它们不能从除
    对象
    以外的任何类继承

  • 这两段话都是引用自

    C#规范对此更为详细:

    10.1.1.3静态类

    静态
    类不能包含
    密封
    抽象
    修饰符。但是,请注意,由于不能实例化或派生
    静态类,因此它的行为就像是
    密封的
    抽象的

    您可以阅读类被
    密封
    抽象
    意味着什么:

    抽象类不能直接实例化,在抽象类上使用新运算符是编译时错误

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

    更新

    还有一个词是关于你提到的查询()中链接的一篇文章。这个问题的答案已经被接受了。如果你仔细阅读,你会发现:

    如果您的编程语言没有对静态类的内置支持,请将
    静态
    类声明为
    密封
    抽象
    ,并添加
    私有
    实例构造函数


    .NET(也就是C#)确实内置了对静态类的支持,因此您不必(甚至不能)通过将类标记为
    密封的
    抽象的
    使其成为伪静态的。首先,让我们从定义开始;sealed是一个修饰符,如果应用于类,则使其不可继承;如果应用于虚拟方法或属性,则使其不可验证

    public sealed class A { ... }
    public class B 
    {
        ...
        public sealed string Property { get; set; }
        public sealed void Method() { ... }
    }
    
    其用法的一个示例是定义一个专门的类/方法或属性,在该类/方法或属性中,可能的更改会使它们按预期停止工作(例如,System.Drawing命名空间的Pens类)

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


    还有一点很重要,就是结构是隐式密封的。

    请看一下Michel Keijzers的回答:什么是混淆?抽象类不能是静态的,另一方面说将静态类声明为抽象类这意味着什么@abhitalsI已经阅读了@MarcinJuraszek的答案,我已经创建了一个密封类A和另一个密封类B,它们扩展或继承了一个类,并且没有错误地解释了如果密封类不被继承怎么可能?不是。试试
    public sealed class A{}
    public sealed class B:A{}
    。您将收到“
    B
    ”:无法从密封类型“
    A
    ”中派生错误消息。谢谢@MarcinJuraszek,您的解释很好,我得到了答案,我只是不知道静态内部定义,因为它的行为类似于密封和抽象,因为静态类不像抽象类那样实例化,不能像密封类那样继承。谢谢
    ...
    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; }
            ...
        }
    }