【问题标题】:In what way is a static class implicitly abstract?静态类以何种方式隐式抽象?
【发布时间】:2015-04-19 23:44:41
【问题描述】:

Jon Skeet 在他的 C# in Depth 一书中谈到了一个静态类:

它不能被声明为抽象的或密封的,尽管它隐含地两者兼有。

抽象类是派生类型的基类。我们只能通过实例化其派生类型之一来实例化抽象类。另一方面,我们不能从密封类派生任何东西。一个密封的、抽象的类在许多方面都是无用的。 Skeet 的静态类既是抽象的又是密封的是什么意思?他只是在谈论无法直接实例化它吗?

【问题讨论】:

  • 好吧,你不能实例化一个,你也不能把它用作其他类的基类。你在你的问题中给出答案......
  • 不能从静态类派生,也不能实例化它。
  • @downvoter 想发表评论吗?
  • 对我来说似乎是一个有效的问题,尤其是当我查看 Jon Skeets 的答案时。
  • 我在哪里可以支持 Jon 的修订?

标签: c# static abstract sealed


【解决方案1】:

它是隐式抽象的,因为你不能实例化这个类。

它是隐式密封的,因为你不能从中派生出来。

【讨论】:

    【解决方案2】:

    CIL 没有静态类。 CIL 有抽象类,也有密封类。抽象类不能直接实例化(尽管具体类可以派生自抽象类)。不能派生密封类。结合这些,你就有了 C# 编译器可以用来实现静态类的东西。

    顺便说一句,CIL 没有静态类这一事实意味着 CIL 中也不存在将静态类作为泛型类型参数的限制。给定static class X,CIL 允许您创建 C# 将调用的List<X>。但是,鉴于不能有 X 的任何实例或从它派生的任何类,您可以在此类列表中存储的唯一值是 null

    【讨论】:

    • 有关更多信息,请查看允许的TypeAttributes,它可以与元数据中的类型相关联。有密封的和抽象的,但没有静态的。
    • 实际上,我们可以通过实例化一个抽象类的派生类来实例化一个抽象类。 Vehicle v = new Car() 创建一个抽象类的实例。
    • @ShaunLuttin 不,这会创建Car 的实例,这是一个具体的类。
    • @ShaunLuttin Huh。实际上,C# 似乎使用了与 CIL 略有不同的术语。 Eric Lippert 说Car 的实例也是Vehicle 的实例。 C# 也持有这种观点。 CIL 没有:“尝试创建抽象对象类型的实例是错误的”。改写以避免这种情况。
    • @ShaunLuttin,在"What you cannot do is create an instance of an abstract class that is not also an instance of a more derived concrete class." 的答案中更进一步。
    【解决方案3】:

    Skeet 所说的静态类既是抽象类又是密封类是什么意思?

    我的意思是这就是 IL 中的表示。

    例如:

    static class Foo {}
    

    生成以下的 IL:

    .class public abstract auto ansi sealed beforefieldinit Foo
           extends [mscorlib]System.Object
    {
    } // end of class Foo
    

    因此,即使是不了解静态类的语言也会阻止您从它派生另一个类,并阻止您实例化它。

    此外,C# 规范是这样引用它的:

    静态类不能包含密封或抽象修饰符。但是请注意,由于静态类不能被实例化或派生,它的行为就好像它既是密封的又是抽象的。

    【讨论】:

    • 我猜你可能知道作者的真正意思:P
    • 减一,因为您没有引用任何来源。编辑:我刚刚看到分数下降了,我想澄清这是一个笑话,我不是反对者。
    • @adv12,有人认真对待你的评论;)
    【解决方案4】:

    这意味着它是隐式抽象的,因为类不能被实例化 它是隐式密封的,因为您不能扩展或继承它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-11-15
      • 2011-09-26
      • 2012-05-23
      • 2011-02-25
      • 2014-01-17
      相关资源
      最近更新 更多