这个问题已经在这里有了答案: > C# optional parameters on overridden methods 9个
这是基于另一个我非常喜欢的有关多态性的SO问题.因此,我试用了它,并对其进行了修改以了解它.但是,这使我对多态性的理解不安.
我在一个类内部创建了一个接口,创建了一个“ A”类,并实现了接口方法.我还创建了另一个扩展了“ A”的类“ B”.以及扩展“ B”的另一个类“ C”.
运行它时,输出为:
BA-> AEP
注意,BA->部分来自B:一个类,而AEP是A:E中不同方法的默认参数
我做的时候怎么调用两个方法
`A instance = new C();
Console.WriteLine(instance.GetName());`
为什么?
class Program
{
interface E
{
string GetName(string s);
}
public class A : E
{
public virtual string GetName(string s="AEP")
{
return s;
}
}
public class B : A
{
public override string GetName(string s="BAP")
{
return "BA-> " + s;
}
}
public class C : B
{
public new string GetName()
{
return "CB->";
}
}
static void Main()
{
A instance = new C();
Console.WriteLine(instance.GetName());
Console.ReadLine();
}
}
解决方法:
该方法不会被调用两次.您看到的是调用了B的覆盖版本,因为运行时实例为C.但是,由于静态类型为A,因此您正在使用A定义的方法的默认参数值.是在调用站点上插入的编译时功能,因此不会考虑重写方法的值.