在C#

时间:2016-04-16 16:45:06

标签: c# .net override method-overriding method-hiding

我找不到令人满意的解释。所以我认为在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();

enter image description here

以下是我对C#中newoverride的理解

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

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

但是,即使BaseClassA引用变量指向DerivedClassC对象并打印DerivedClassB的输出,该怎么办?

请用简单的词语解释。

1 个答案:

答案 0 :(得分:2)

  

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

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

有效地,这样想:

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

我认为将DerivedClassC视为

class DerivedClassC : DerivedClassB
{
}

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