多态方法在只调用一次时运行两次

本文关键字:一次 运行 两次 方法 调用 多态 | 更新日期: 2023-09-27 18:10:11

这是基于另一个我非常喜欢的关于多态的问题。所以我摆弄它,修改它来理解它。但这打乱了我对多态性的理解。

我在一个类内部创建了一个接口,创建了一个类"a",并实现了接口方法。我还创建了另一个类"B"来扩展"a"。另一个类"C"扩展了" b "

当你运行它时,输出是:

BA-> AEP

注意BA->部分来自B : A类,而AEPA : 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")声明进行编译。