c#-多态方法仅被调用一次就运行两次

这个问题已经在这里有了答案:            >            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定义的方法的默认参数值.是在调用站点上插入的编译时功能,因此不会考虑重写方法的值.

上一篇:C++中关于两个集合比较的STL算法


下一篇:一个小实例——选餐Demo