这是基于另一个关于多态性的问题,我非常喜欢。所以我玩了它并修改它以理解它。但随后它使我对多变态的理解感到不安。
我在类中创建了一个接口,创建了一个类“A”,并实现了接口方法。我还创建了另一个扩展“A”的类“B”。另一个扩展“B”的类“C”
运行时,输出为:
BA-> AEP
请注意,BA->
部分来自B : A
课程,而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();
}
}
答案 0 :(得分:4)
该方法未被调用两次。您所看到的是调用B
的被覆盖版本,因为运行时实例是C
。但是,因为静态类型为A
,所以您使用A
定义的方法的默认参数值。默认参数是在调用站点插入的编译时功能,因此它不会考虑重写方法的值。
答案 1 :(得分:0)
这里使用的是默认参数,它是纯语法糖,并在编译时根据您使用的类方法解析。
A instance = new C();
Console.WriteLine(instance.GetName());
由于没有参数的GetName()
方法,编译器使用默认参数值,并使用类A
中的声明(编译时已知的变量)将其编译为{{1 }}