抽象类不能在 c# 中密封
本文关键字:密封 不能 抽象类 | 更新日期: 2023-09-27 18:35:48
>我在某处读到
过"抽象修饰符和密封修饰符等效于静态类"
我还发现
"当您声明静态类时,编译器会在内部将类标记为抽象和密封,并在 IL 代码中创建私有构造函数"
所以,我决定这样做:
static class A
{
public static void test()
{
Console.WriteLine("test");
}
}
现在,类"A"不能继承也不能实例化。
因此,让我们使用 abstract
来防止实例化并使用 sealed
来防止继承来编写一个class B
。
但是,这种方法失败了。
这应该等同于
public abstract sealed class B
{
private B()
{
}
public void test()
{
Console.WriteLine("test");
}
}
But I recieve an error stating "error CS0418:
B':抽象类不能是密封的或静态的"。任何想法为什么这是不可能的?
提前感谢您的回答。
检查了 System.Directory 类(静态)的 IL 后,它在 IL 中声明为:
.class public auto ansi abstract sealed beforefieldinit System.IO.Directory
extends System.Object
{
...
此外,本文(http://msdn.microsoft.com/en-us/library/ms229038.aspx)建议CLR将静态类作为抽象密封类处理,以支持不支持直接静态类的语言(例如C++)。
因此,总而言之,C# 中的静态类是具有私有构造函数的密封抽象类的语法糖。我很高兴,因为"静态"更容易写,也更容易正确。
根据定义,sealed
类使您能够防止继承以前标记为虚拟的类或某些类成员。
Abstract
关键字使您能够创建不完整且必须在派生类中实现的类和类成员。(来源:http://msdn.microsoft.com/en-us/library/ms173150.aspx)
这意味着任何标记为抽象的类都无法被密封,因为您将无法在任何地方派生它。
您提到的代码没有任何意义。
所有答案都以某种方式从技术角度出发。如:类不能同时"必须继承"和"不能继承"。但我认为这不是主要原因,很明显,"静态"就是这样。我认为大卫·阿莫的回答有点触动了真正的答案,他说:"做对要容易得多"。
我确信 Anders Hejlsberg 在设计 C# 时的想法是消除歧义,从而减少出错的机会。这就是为什么"虚拟"与"覆盖"(覆盖必须是显式的,而不是像Java中那样隐式)。在这种情况下,"抽象"+"密封"将与"静态"相同。定义相同原则的两种方式。这是: - 更容易出错(想象一下你在某处抽象并意外地密封在那里而没有注意到,ONW 编译器可以防止这种情况) - 更难使用(假设你想搜索项目中的所有静态类)
所以我的观点是,这整个设计引导开发人员正确的做事方式。