繁体   English   中英

抽象类不能用c#封装?

[英]Abstract class cannot be sealed in c#?

我在某处读到了

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

我也发现了

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

所以,我决定这样做:

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

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

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

但是,这种方法失败了。

这相当于

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM