using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var a = new Derived();
int x = 123;
a.Foo(x);
}
}
public class Base
{
public virtual void Foo(int x)
{
Console.WriteLine("Base::Foo");
}
}
public class Derived : Base
{
public override void Foo(int x)
{
Console.WriteLine("Derived::Foo(int x)");
}
public void Foo(object o)
{
Console.WriteLine("Derived::Foo(object o)");
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:"Derived :: Foo(object o)"
为什么???
Jon*_*eet 20
当编译器尝试寻找候选方法签名,准备重载,它着眼于最派生类型第一,并去除覆盖的方法只有在"新申报"在类的签名看.
如果它找到了一个适用的方法,它就不会继续进行继承链以查找其他签名.在这种情况下,这是违反直觉的(至少与我的直觉相反).它的设计,以避免"脆基类"的问题,在这里改变的基类影响以出乎意料的方式其他代码-但是当该方法实际上是覆盖在派生类中,我看不到好处.(不可否认,这意味着看似无操作的方法,只是为了调用基础实现来覆盖方法,并不像你预期的那样安全可移除.)
关于这种情况和其他极端情况,我有一篇相当长的文章会对一些细节进行重载 - 你可能会觉得它很有用.有关更多详细信息,请参阅C#规范的7.5.3节.
底线:注意重载,尤其是跨越继承边界.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |