在 C# 中结合方法隐藏和方法覆盖

Combining Method hiding and method overriding in C#

对此我找不到满意的解释。所以我认为这对 post 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#newoverride 的理解

New - 它隐藏了 baseclass 方法。因此,即使 baseclass 引用变量指向派生的 class 对象,如果派生的 class 隐藏了该方法,输出将仅为 baseclass 输出。

Override - 它覆盖了 baseclass 方法。因此,即使 baseclass 引用变量指向派生 class 对象,如果派生 class 重写该方法,输出将派生 class output.

但是在这里,甚至 BaseClassA 引用变量如何指向 DerivedClassC 对象并打印 DerivedClassB 的输出?

请简单说明。

But here how can even a BaseClassA reference variable point to DerivedClassC object and it prints DerivedClassB's output ?

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

有效地,这样想:

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

我认为 DerivedClassC 只是

class DerivedClassC : DerivedClassB
{
}

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