【问题标题】:C# using virtual-override [duplicate]C#使用虚拟覆盖[重复]
【发布时间】:2021-03-26 21:04:35
【问题描述】:

在此示例中,它通过虚拟覆盖关键字使用多态

 abstract class A
    {
        public virtual string Print() { return "A"; }
    }
    
    class B : A
    {
        public override string Print() { return "B"; }
    }
    
    class C : B
    {
        public virtual new string Print() { return "C"; }
    }
    
    class D : C
    {
        public override string Print() { return "D"; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            A a = new D();
    
            Console.WriteLine(a.Print());
        }
    }

控制台打印 B。为什么是 B,而不是 D?谢谢解答

【问题讨论】:

  • Console.WriteLine((a as D).Print())
  • 谁认为这是一个好问题,认为它是典型的 quiz question 转发,没有任何研究尝试。

标签: c# polymorphism


【解决方案1】:

简单,因为最后一次覆盖A类的Print函数是在B类的声明期间

    class B : A
    {
        public override string Print() { return "B"; }
    }

通过声明public virtual new,您隐藏了Print 的底层实现。因此,在 D 声明期间,您将覆盖在 C 类中声明的新实现

现在A,一旦你隐藏了B上的功能,对你做了什么一无所知

【讨论】:

    【解决方案2】:

    这就是隐藏其父类方法的方法的问题。它不是多态的。由于变量的类型为A,方法Print() 的分辨率只知道A.Print() 和B.Print()。 C.Print() 和 D.Print() 不是 A.Print() 的覆盖,因为 C.Print() 使用 new 声明。

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2012-06-04
      • 2011-05-21
      相关资源
      最近更新 更多