下面的代码应该给出警告吗?为什么我的Static方法隐藏我的实例方法?
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public static void Do() { /*...*/ } /*...*/ }
它提供:
“警告CS0108: 'Bar.Do()' 隐藏了继承的成员 'Foo.Do()' 使用new关键字隐藏,如果是打算。”
如果我进行了更改代码:
class Foo { public static void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public void Do() { /*...*/ } /*...*/ }
我得到同样的警告。
但是,如果我做了以下更改,警告消失。
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { new public static void Do() { /*...*/ } /*...*/ }
让我做出进一步的变化:
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo {
new public static void Do()
{ new Bar().Do();/*...*/ } /*...*/
}
这并不编译:
“错误CS0176:会员 'Bar.Do()' 不能用一个实例来访问引用;改为使用类型名称对其进行限定。“
于是,我通过从一个静态方法实例引用失去了我的继承方法的访问!
它背后的逻辑是什么?或者我在某处犯了一个错字?
我碰到这个来的时候,我试图定义一个静态方法“显示”从“形式”得出自己的状态。
当我说。 “新的酒吧()做();”。我肯定会调用实例方法“Do”,它可以在Bar via Foo中找到。那么,为什么我们必须输入演员? – isntn 2009-04-16 16:28:03
因为编译器不查看实例,而是查看类型元数据。在这里它只找到一个具有正确签名(名称和空参数列表)的方法,这是静态的。 – Lucero 2009-04-16 16:29:11
用虚拟功能表来考虑它; Bar :: Do()映射隐藏了Foo:Do()的映射。 – 2009-04-16 16:32:42