【问题标题】:C# new not working as expected on derived class-inheritence [duplicate]C# new 在派生类继承上无法按预期工作 [重复]
【发布时间】:2019-03-31 11:37:28
【问题描述】:

给出下面的代码。我想知道为什么我的输出不是 B A B,而是 B A A

class A
{
    public virtual void display()
    {
        Console.WriteLine("A");
    }
}
class B : A
{
    public new void display()
    {
        Console.WriteLine(" B ");
    }
}
class Program
{
    static void Main(string[] args)
    {
        A obj1 = new B();
        B obj2 = new B();
        obj2.display();
        A r;
        r = obj1;
        r.display();
        r = obj2;
        r.display();
        Console.ReadLine();
    }
}
//Output:
B
A
A

由于 r 现在是对类 B(obj2) 的引用,它应该输出 B,但它输出的是 A。

【问题讨论】:

  • 它的工作方式与大多数人的预期完全一样,所以如果它不符合您的预期,请解释您的预期以及为什么这些是您的预期.
  • 我已经写过了,我期待 B A B,得到输出为 BAA
  • 但是为什么。你还没有解释你的理由
  • ok 推理如下 1.obj2 因为new关键字会输出B。
  • @ShadmanMahmood 看我的编辑,方法隐藏是关于 variable 是什么类型,而不是它指向的类型是什么

标签: c# inheritance method-hiding


【解决方案1】:

new 不是这样工作的。 override 的工作原理。

new(方法隐藏)仅在您的变量类型(注意实际类型无关)是派生类型时才有效。您的第二个测试只是多态性,为此您需要 override

class B : A
{
    public override void display()
    {
        Console.WriteLine(" B ");
    }
}

旁注,您几乎需要隐藏方法。

【讨论】:

  • 我知道,但这是一个 mcq 问题,所以我对输出感到困惑
  • @ShadmanMahmood 不知道 mcq 是什么,也许问题是错的?
  • mcq 是一道选择题。我想知道为什么输出是这样的。就这些
  • @ShadmanMahmood Errr...。好的。第二段(和链接的副本)解释了这一点,你错过了隐藏方法和使用 polymorphsim 之间的区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多