案例1:
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)
的方法称为CC_5。
如果DerivedClass
不继承BaseClass
类,则输出为DerivedClass Print(int)
。
请解释.......
这是过载分辨率与继承一起工作的方式:
- 包括
override
修饰符的功能不包括在候选人集中。 - 由于可以使用具有
object
参数的函数,因此从候选人组中删除了基数中声明的函数。
获胜者是带有object
参数的功能。
根据Eric Lippert(来自Microsoft(的说法:
这是通过设计,有充分的理由。这种设计有助于防止脆性基类问题。C#旨在使编写"版本化"组件变得更容易,更安全,而该规则是其中的很大一部分。
当不使用继承时,两个功能都是候选者,并且使用了更具体的功能。获胜者是int
参数的功能。