一尘不染

为什么我不能继承静态类?

c#

我有几个不需要任何状态的类。从组织的角度来看,我想将它们分为层次结构。

但是似乎我不能声明静态类的继承。

像这样:

public static class Base
{
}

public static class Inherited : Base
{
}

不管用。

语言的设计师为什么要关闭这种可能性?


阅读 303

收藏
2020-05-19

共1个答案

一尘不染

这里引文:

这实际上是设计使然。似乎没有充分的理由继承静态类。它具有公共静态成员,您始终可以通过类名称本身访问它。
我看到的继承静态内容的唯一原因是不好的原因,例如保存了几个打字字符。

也许有理由考虑将静态成员直接带入范围的机制(实际上,我们将在Orcas产品周期之后考虑这一点),但是静态类继承并不是要走的路:这是使用错误的机制,并且有效仅针对碰巧驻留在静态类中的静态成员。

(Mads Torgersen,C#语言PM)

来自channel9的其他意见

.NET中的继承仅在实例基础上起作用。 静态方法是在类型级别而不是实例级别定义的。这就是为什么覆盖不适用于静态方法/属性/事件的原因…

静态方法仅在内存中保存一次。没有为它们创建的虚拟表等。

如果在.NET中调用实例方法,则始终为它提供当前实例。.NET运行时将其隐藏,但是会发生。
每个实例方法都有一个指向该方法在其上运行的对象的指针(引用)作为第一个参数。
静态方法不会发生这种情况
(因为它们是在类型级别定义的)。编译器应如何决定选择要调用的方法?

(小小古鲁)

作为一个有价值的想法, littleguru
对于此问题有部分“解决方法”:Singleton模式。

2020-05-19