抽象类不能用c#封装?

时间:2013-10-16 13:19:58

标签: c# oop .net-4.0 static abstract-class

我在某处读到了

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

我也发现了

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

所以,我决定这样做:

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

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

因此,让我们使用class B编写abstract来阻止实例化并使用sealed来阻止继承。

但是,这种方法失败了。

应该等同于

public abstract sealed class B
{
    private B()
    {

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

But I recieve an error stating "error CS0418: B':抽象类不能被密封或静态“`。任何想法为什么这是不可能的?

提前感谢您的回答。

3 个答案:

答案 0 :(得分:11)

检查了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#中的静态类是具有私有构造函数的密封抽象类的语法糖。我很高兴,因为“静态”写起来容易得多,而且更容易做对。

答案 1 :(得分:3)

根据定义,sealed类使您可以阻止继承先前标记为虚拟的类或某些类成员。

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

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

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

答案 2 :(得分:1)

所有答案都以某种方式采用技术观点。如:班级不能继承"必须继承"并且"不能继承"同时。但我认为这不是主要原因,显然,"静态"就是这样。 我认为David Amo的回答有点触及了真正的答案,并指出:"更容易做出正确的答案"。

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

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