Cod*_*dex 4 .net c# oop methods
我有以下代码示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出如下:
基地: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);}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |