多态方法在只调用一次时运行两次
本文关键字:一次 运行 两次 方法 调用 多态 | 更新日期: 2023-09-27 18:10:11
这是基于另一个我非常喜欢的关于多态的问题。所以我摆弄它,修改它来理解它。但这打乱了我对多态性的理解。
我在一个类内部创建了一个接口,创建了一个类"a",并实现了接口方法。我还创建了另一个类"B"来扩展"a"。另一个类"C"扩展了" b "
当你运行它时,输出是:
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();
}
}
该方法不会被调用两次。您看到的是调用了B
的重写版本,因为运行时实例是C
。但是,因为静态类型是A
,所以您使用的是A
定义的方法的默认参数值。默认参数是在调用站点插入的编译时特性,因此它不会考虑被覆盖方法的值。
您在这里使用的是默认参数,这是纯语法糖,并在编译时根据您正在使用的类方法进行解析。
A instance = new C();
Console.WriteLine(instance.GetName());
由于没有没有参数的GetName()
方法,编译器使用默认参数值,并使用A
类(在编译时称为变量)中的GetName("AEP")
声明进行编译。