我有几个不需要任何状态的类。从组织的角度来看,我想将它们分为层次结构。
但是似乎我不能声明静态类的继承。
像这样:
public static class Base { } public static class Inherited : Base { }
不管用。
语言的设计师为什么要关闭这种可能性?
从这里引文:
这实际上是设计使然。似乎没有充分的理由继承静态类。它具有公共静态成员,您始终可以通过类名称本身访问它。 我看到的继承静态内容的唯一原因是不好的原因,例如保存了几个打字字符。 也许有理由考虑将静态成员直接带入范围的机制(实际上,我们将在Orcas产品周期之后考虑这一点),但是静态类继承并不是要走的路:这是使用错误的机制,并且有效仅针对碰巧驻留在静态类中的静态成员。 (Mads Torgersen,C#语言PM)
这实际上是设计使然。似乎没有充分的理由继承静态类。它具有公共静态成员,您始终可以通过类名称本身访问它。 我看到的继承静态内容的唯一原因是不好的原因,例如保存了几个打字字符。
也许有理由考虑将静态成员直接带入范围的机制(实际上,我们将在Orcas产品周期之后考虑这一点),但是静态类继承并不是要走的路:这是使用错误的机制,并且有效仅针对碰巧驻留在静态类中的静态成员。
(Mads Torgersen,C#语言PM)
来自channel9的其他意见
.NET中的继承仅在实例基础上起作用。 静态方法是在类型级别而不是实例级别定义的。这就是为什么覆盖不适用于静态方法/属性/事件的原因… 静态方法仅在内存中保存一次。没有为它们创建的虚拟表等。 如果在.NET中调用实例方法,则始终为它提供当前实例。.NET运行时将其隐藏,但是会发生。 每个实例方法都有一个指向该方法在其上运行的对象的指针(引用)作为第一个参数。 静态方法不会发生这种情况(因为它们是在类型级别定义的)。编译器应如何决定选择要调用的方法? (小小古鲁)
.NET中的继承仅在实例基础上起作用。 静态方法是在类型级别而不是实例级别定义的。这就是为什么覆盖不适用于静态方法/属性/事件的原因…
静态方法仅在内存中保存一次。没有为它们创建的虚拟表等。
如果在.NET中调用实例方法,则始终为它提供当前实例。.NET运行时将其隐藏,但是会发生。 每个实例方法都有一个指向该方法在其上运行的对象的指针(引用)作为第一个参数。 静态方法不会发生这种情况(因为它们是在类型级别定义的)。编译器应如何决定选择要调用的方法?
(小小古鲁)
作为一个有价值的想法, littleguru 对于此问题有部分“解决方法”:Singleton模式。