C# 为什么抽象类不能是密封的或静态的?
为什么抽象类不能是密封的或静态的? 我也对这个问题感到困惑C# 为什么抽象类不能是密封的或静态的?,c#,abstract-class,static-classes,sealed,C#,Abstract Class,Static Classes,Sealed,为什么抽象类不能是密封的或静态的? 我也对这个问题感到困惑 静态类无法标记为密封,因为默认情况下编译器将其制作为密封 静态类是密封的,因此无法继承 静态类不能标记为抽象,因为它将毫无意义抽象类是有意义的。但是,因为不能派生出静态类类,所以其他类无法实现这些间隙 它们不能从除对象以外的任何类继承 这两段话都是引用自 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; }
...
}
}