【问题标题】:Abstract class cannot be sealed in c#?抽象类不能在c#中密封?
【发布时间】:2013-10-24 15:16:52
【问题描述】:

我在某处读过

“Abstract 和 Sealed 修饰符等价于静态类”

我也发现了

“当你声明一个静态类时,编译器在内部标记类抽象和密封,并在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': 一个抽象类不能是密封的或静态的"`。任何想法为什么这是不可能的?

提前感谢您的回答。

【问题讨论】:

  • 为什么要抽象密封类?这没有任何意义。
  • 我不想要它。我只是在检查这些修饰符是否等同于所说的静态类。
  • 编译器做的不一定让开发者遵循
  • 编译器不允许您执行abstract sealed class,即使这相当于static class 所做的。它希望您使用static class 来执行此操作。
  • 当你把abstract sealed class翻译成VB.NET你得到MustInherit CannotInherit Class

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


【解决方案1】:

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

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

这意味着任何标记为抽象的类都不能被密封,因为你不能在任何地方派生它。

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

【讨论】:

  • 这不是一个有效的答案吗?
  • 人们对此表示反对,因为您没有包含相关来源(MSDN 等)。为了记录,我自己没有投反对票。
  • 如果静态类被编译成密封抽象类,那么你声称密封抽象类没有意义显然是荒谬的......
  • 他们不是。 .NET 支持静态类,因此它们不会“编译”为密封的抽象类。 .NET 中没有这样的野兽(密封抽象类)。
  • 那么 IL 也缺少这个概念。该类仍然是静态的,它不会是实例类。非静态类允许非静态字段和其他成员,静态类不允许,并且这些类绝不允许这样做。但我同意,我对这里使用的术语有误。
【解决方案2】:

检查了 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# 中的静态类是具有私有构造函数的密封抽象类的语法糖。我对此感到高兴,因为“静态”更容易编写,也更容易正确。

【讨论】:

    【解决方案3】:

    所有答案都以某种技术角度。如:类不能同时“必须继承”和“不能继承”。但我认为这不是主要原因,很明显,“静态”就是这样。 我认为 David Amo 的回答有点触及到真正的答案,他说:“做对要容易得多”。

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2014-01-24
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      相关资源
      最近更新 更多