Use*_*ser 216 c# inheritance static
我有几个不需要任何州的课程.从组织的角度来看,我想把它们放到层次结构中.
但似乎我无法为静态类声明继承.
像这样的东西:
public static class Base
{
}
public static class Inherited : Base
{
}
Run Code Online (Sandbox Code Playgroud)
不管用.
为什么语言的设计者会关闭这种可能性?
boj*_*boj 168
来自这里的引文:
这实际上是设计的.似乎没有充分的理由继承静态类.它有公共静态成员,您始终可以通过类名本身访问它们.我看到继承静态内容的唯一原因是糟糕的,例如保存几个字符的输入.
可能有理由考虑将静态成员直接引入范围的机制(事实上我们将在Orcas产品周期之后考虑这一点),但静态类继承不是要走的路:它是错误的使用机制,并且有效仅适用于碰巧驻留在静态类中的静态成员.
(Mads Torgersen,C#语言PM)
来自channel9的其他意见
.NET中的继承仅适用于实例库.静态方法是在类型级别上定义的,而不是在实例级别上定义的.这就是为什么覆盖不适用于静态方法/属性/事件...
静态方法只在内存中保存一次.没有为它们创建的虚拟表等.
如果在.NET中调用实例方法,则始终为其提供当前实例.这是.NET运行时隐藏的,但它确实发生了.每个实例方法都将第一个参数作为运行该方法的对象的指针(引用).静态方法不会发生这种情况(因为它们是在类型级别定义的).编译器应该如何决定选择要调用的方法?
(littleguru)
作为一个有价值的想法,littleguru对此问题有一个部分"解决方法":Singleton模式.
And*_*are 70
您不能继承静态类的主要原因是它们是抽象的和密封的(这也可以防止创建它们的任何实例).
所以这:
static class Foo { }
Run Code Online (Sandbox Code Playgroud)
汇编到这个IL:
.class private abstract auto ansi sealed beforefieldinit Foo
extends [mscorlib]System.Object
{
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*orn 24
这样考虑一下:通过类型名称访问静态成员,如下所示:
MyStaticType.MyStaticMember();
Run Code Online (Sandbox Code Playgroud)
如果您继承该类,则必须通过新类型名称访问它:
MyNewType.MyStaticMember();
Run Code Online (Sandbox Code Playgroud)
因此,当在代码中使用时,新项目与原始项目没有关系.对于像多态这样的东西,没有办法利用任何继承关系.
也许您认为您只想扩展原始课程中的一些项目.在这种情况下,没有什么可以阻止您只使用全新类型的原始成员.
也许您想要将方法添加到现有的静态类型中.您可以通过扩展方法完成此操作.
也许你希望能够通过一个静态的Type在运行时函数,调用一个方法上的类型,不知道该方法做什么.在这种情况下,您可以使用接口.
所以,最后你并没有从继承静态类中获得任何东西.
| 归档时间: |
|
| 查看次数: |
138636 次 |
| 最近记录: |