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

标签 c# polymorphism

<分区>

这是基于另一个我非常喜欢的关于多态性的问题。所以我玩弄它并修改它以理解它。但后来它动摇了我对多态性的理解。

我在一个类中创建了一个接口(interface),创建了一个类“A”,并实现了接口(interface)方法。我还创建了另一个扩展“A”的类“B”。另一个类“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 定义的方法的默认参数值。默认参数是在调用站点插入的编译时功能,因此它不会考虑重写方法的值。

关于c# - 多态方法仅调用一次时运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393254/

相关文章:

c# - C#中的线程错误

c# - ApplicationPoolIdentity 下来自 C# 的远程 PowerShell session

c++ - 如何从多态层次结构中的基类引用调用子类的成员

java - 将子项转换为父项 - 由于缺少方法而导致编译时错误 - 为什么?

c++ - vector map 的实现

java - java中多态性的例子

c# - 当数字存储为字符串时,从表中选择最大的数字?

c# - USB 中继单元编程

c# - 如何从 C# 访问 SDK?

php - 复杂的 Laravel 关系