experience 发表于 2013-2-4 20:01:29

重写方法不被认为是在类上声明的

 
当在类中指定方法时,如果有多个方法与调用兼容(例如,存在两种同名的方法,并且其参数与传递的参数兼容),则 C# 编译器将选择最佳方法进行调用。下面的方法将是兼容的:
C#
http://msdn2.microsoft.com/msdn/Controls/CodeSnippet/zh-cn/copy_off.gif 复制代码
public class Derived : Base{public override void DoWork(int param) { }public void DoWork(double param) { }}在 Derived 的一个实例中调用 DoWork 时,C# 编译器将首先尝试使该调用与最初在 Derived 上声明的 DoWork 版本兼容。重写方法不被视为是在类上进行声明的,而是在基类上声明的方法的新实现。仅当 C# 编译器无法将方法调用与 Derived 上的原始方法匹配时,它才尝试将该调用与具有相同名称和兼容参数的重写方法匹配。例如:
C#
http://msdn2.microsoft.com/msdn/Controls/CodeSnippet/zh-cn/copy_off.gif 复制代码
int val = 5;Derived d = new Derived();d.DoWork(val);// Calls DoWork(double).由于变量 val 可以隐式转换为 double 类型,因此 C# 编译器将调用 DoWork(double),而不是 DoWork(int)。有两种方法可以避免此情况。首先,避免将新方法声明为与虚方法同名。其次,可以通过将 Derived 的实例强制转换为 Base 来使 C# 编译器搜索基类方法列表,从而使其调用虚方法。由于是虚方法,因此将调用 Derived 上的 DoWork(int) 的实现。例如:
C#
http://msdn2.microsoft.com/msdn/Controls/CodeSnippet/zh-cn/copy_off.gif 复制代码
((Base)d).DoWork(val);// Calls DoWork(int) on Derived.
页: [1]
查看完整版本: 重写方法不被认为是在类上声明的