我有以下代码示例:
public class Base { public virtual void MyMethod(int param) { Console.WriteLine("Base:MyMethod - Int {0}", param); } } public class Derived1 : Base { public override void MyMethod(int param) { Console.WriteLine("Derived1:MyMethod - Int {0}", param); } public void MyMethod(double param) { Console.WriteLine("Derived1:MyMethod - Double {0}", param); } } class Program { static void Main(string[] args) { Base objB = new Base(); objB.MyMethod(5); Base objBD = new Derived1(); objBD.MyMethod(5); Derived1 objD = new Derived1(); objD.MyMethod(5); Console.ReadLine(); } }
上面代码的输出如下:
基地:MyMethod - Int 5
Derived1:MyMethod - Int 5
Derived1:MyMethod - Double 5
对于使用'objD'第三次调用'MyMethod',为什么在我实际传递INT时使用'DOUBLE'重载.
使用'objBD'的第二次调用似乎行为正确.请建议.
奇怪的是,那天晚上我和乔恩正在讨论这个问题!有一个优先级问题 - 重写的方法是在基类中定义的,因此出于"最佳方法"的目的,重载(即使使用隐式转换)是优选的,因为它是在最具体的类型(子类)中定义的).
如果你重新声明了方法(new
),那么它将获得优先权,但你不能override
和new
同一类型中具有相同名称和签名的方法 - 你必须添加额外的继承级别来实现这一点.
对此的确切逻辑在ECMA 334 v4的14.5.5和14.4.2中有详细说明.
基本上,要使基本方法可调用,您必须强制转换为基类型,或者添加填充方法:
public void MyMethod2(int param) {base.MyMethod(param);}