1

我只是找不到令人满意的解释。所以我认为在 SO 上发布这个会有所帮助。

当我们结合时会发生什么method hiding and overriding in C# ?

对于以下示例:

class BaseClassA
{
    public virtual void showMessage()
    {
        Console.WriteLine("In BaseClass A ");
    }
}
class DerivedClassB : BaseClassA
{
    public override void showMessage()
    {
        Console.WriteLine("In DerivedClass B ");
    }
}

class DerivedClassC : DerivedClassB
{
    public new void showMessage()
    {
        Console.WriteLine("In DerivedClass C");
    }
}

class Program
{
    static void Main(string[] args)
    {
        BaseClassA a = new BaseClassA();
        a.showMessage();
        a = new DerivedClassB();
        a.showMessage();
        BaseClassA b = new DerivedClassC();
        b.showMessage();
        Console.ReadKey();   
    }
}

我理解的输出

 BaseClassA b = new DerivedClassC();
 b.showMessage();

在此处输入图像描述

这是我对C#new的理解override

New- 它隐藏了基类方法。因此,即使基类引用变量指向派生类对象,如果派生类隐藏了方法,输出也将只是基类输出。

Override- 它覆盖了基类方法。因此,即使基类引用变量指向派生类对象,如果派生类覆盖该方法,输出也将是派生类输出。

但是这里怎么可能连BaseClassA引用变量都指向一个DerivedClassC对象并打印DerivedClassB输出呢?

请用简单的话解释一下。

4

1 回答 1

2

但是在这里 BaseClassA 引用变量怎么能指向 DerivedClassC 对象并打印 DerivedClassB 的输出呢?

代码调用由 声明BaseClassA但被 覆盖的方法DerivedClassB。在中声明的方法DerivedClassC是一种新方法,在某种程度上与BaseClassA... 中声明的方法完全不同,就好像它具有不同的名称一样。

有效地,这样想:

  • 如果DerivedClassC根本没有声明showMessage方法,它会从 继承实现DerivedClassB,对吗?
  • 引入方法不会改变输出,因为它是一个单独的方法,不涉及覆盖DerivedClassA. 所以输出与上一步相同。

我认为尝试DerivedClassC只是

class DerivedClassC : DerivedClassB
{
}

并且理解输出是理解后来行为的关键。

于 2016-04-16T16:54:20.990 回答