抽象类不能用c#封装?

我在某处读到了

“抽象和密封修饰符相当于一个静态的类”

我也发现了

“当你声明一个静态类时,编译器在内部标记类抽象并密封,并在IL代码中创建一个私有构造函数”

所以,我决定这样做:

static class A { public static void test() { Console.WriteLine("test"); } } 

现在,类“A”不能被inheritance或实例化。

因此,让我们使用abstract编写一个class B来防止实例化并使用sealed来防止inheritance。

但是,这种方法失败了。

这相当于

 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类可以防止inheritance先前标记为虚拟的类或某些类成员。

Abstract关键字使您可以创建不完整的类和类成员,并且必须在派生类中实现。 (来源: http : //msdn.microsoft.com/en-us/library/ms173150.aspx )

这意味着任何标记为摘要的类都无法被密封,因为您无法在任何地方获取它。

你提到的代码没有任何意义。

所有答案都以某种方式采用技术观点。 如:类不能同时“必须inheritance”和“不能inheritance”。 但我认为这不是主要原因,显然,“静态”就是这样。 我认为大卫·阿莫的回答有点触及了真正的答案,他说:“这样做要容易得多”。

我确信Anders Hejlsberg在设计C#时的想法是消除歧义,从而减少错误的机会。 这就是“虚拟”与“覆盖”相关的原因(覆盖必须是显式的,而不是像Java那样隐式)。 在这种情况下,“抽象”+“密封”将与“静态”相同。 两种定义相同原理的方法。 这是: – 更容易出错(想象你有一个抽象的地方并且意外地密封在那里而没有注意到,onw编译器阻止了这一点) – 更难以使用(想象你想在你的项目中搜索所有静态类)

所以我的观点是,整个设计引导开发人员正确的做事方式。