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

时间:2014-06-24 17:55:36

标签: c# polymorphism

这是基于另一个关于多态性的问题,我非常喜欢。所以我玩了它并修改它以理解它。但随后它使我对多变态的理解感到不安。

我在类中创建了一个接口,创建了一个类“A”,并实现了接口方法。我还创建了另一个扩展“A”的类“B”。另一个扩展“B”的类“C”

运行时,输出为:

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();
    }
}

2 个答案:

答案 0 :(得分:4)

该方法未被调用两次。您所看到的是调用B的被覆盖版本,因为运行时实例是C。但是,因为静态类型为A,所以您使用A定义的方法的默认参数值。默认参数是在调用站点插入的编译时功能,因此它不会考虑重写方法的值。

答案 1 :(得分:0)

这里使用的是默认参数,它是纯语法糖,并在编译时根据您使用的类方法解析。

    A instance = new C();
    Console.WriteLine(instance.GetName());

由于没有参数的GetName()方法,编译器使用默认参数值,并使用类A中的声明(编译时已知的变量)将其编译为{{1 }}