抽象类不能在 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':抽象类不能是密封的或静态的"。任何想法为什么这是不可能的?

提前感谢您的回答。

抽象类不能在 c# 中密封

检查了 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 编译器可以防止这种情况) - 更难使用(假设你想搜索项目中的所有静态类)

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