【发布时间】:2018-02-19 06:16:37
【问题描述】:
案例一:
public class BaseClass
{
public virtual void Print(int i)
{
Console.WriteLine("BaseClass Print(int)");
}
}
public class DerivedClass : BaseClass
{
public override void Print(int i)
{
Console.WriteLine("DerivedClass Print(int)");
}
public void Print(object obj)
{
Console.WriteLine("DerivedClass Print(object)");
}
}
static void Main(string[] args)
{
DerivedClass objDerivedClass = new DerivedClass();
int i = 10;
objDerivedClass.Print(i);
}
输出是DerivedClass Print(object)。
案例 2:
public class SomeClass
{
public void Print(int i)
{
Console.WriteLine("DerivedClass Print(int)");
}
public void Print(object obj)
{
Console.WriteLine("DerivedClass Print(object)");
}
}
static void Main(string[] args)
{
SomeClass objSomeClass = new SomeClass();
int i = 10;
objSomeClass.Print(i);
}
输出是DerivedClass Print(int)。
调用objDerivedClass.Print(i);方法后,输出为DerivedClass Print(object)。我不明白为什么要调用 Print(object obj) 方法而不是 Print(int i)。
如果DerivedClass 不继承BaseClass 类,则输出为DerivedClass Print(int)。
请解释......
【问题讨论】:
-
C# 语言规范的第 7.5.3 节是关于重载解决方案的,因此您应该参考它。鉴于这种行为,我会假设,如果有多个可能的候选者,则当前类型的成员优先于基类型的重载成员。这真的不是问题,因为如果参数是适当的类型,您总是可以编写重载来调用覆盖。
标签: c# inheritance overload-resolution