【问题标题】:Combining Method hiding and method overriding in C#在 C# 中结合方法隐藏和方法覆盖
【发布时间】:2016-04-16 16:45:05
【问题描述】:

我只是找不到令人满意的解释。所以我认为在 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 - 它隐藏了基类方法。因此,即使基类引用变量指向派生类对象,如果派生类隐藏了方法,输出也将只是基类输出。

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

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

请用简单的话解释一下。

【问题讨论】:

    标签: c# .net overriding method-hiding


    【解决方案1】:

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

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

    实际上,这样想:

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

    我认为尝试DerivedClassC 就像

    class DerivedClassC : DerivedClassB
    {
    }
    

    理解那个输出是理解后面行为的关键。

    【讨论】:

    • 感谢您的及时回复。但是我没有得到这部分......为什么我认为 DerivedClassC 没有声明 showMessage() ?是的,它会从DerivedClassB 继承实现,但从BaseClassA 继承。那么DerivedClassC 不会隐藏BaseClassA 的方法吗?我想错了吗?
    • @StrugglingCoder:是的,DerivedClassC 隐藏了BaseClassA 的方法,但您没有在DerivedClassC 类型的变量上调用该方法。如果你有DerivedClassC c = new DerivedClassC(); c.showMessage();,那么你会看到“In DerivedClass C”。
    • 这正是我的困惑。为什么我不调用那个隐藏的方法?如果DerivedClassC : BaseClassA 然后BaseClassA a = new DerviedClassC 那么我肯定会看到In BaseClass A to be printed。但为什么不在这里?只是因为DerivedClassC : DerivedClassBDerivedClassB : BaseClass A right ? 我错过了什么吗?
    • @StrugglingCoder:您之所以调用它并不是因为它是“新的”——它不会覆盖先前声明的方法。您正在对编译时类型为BaseClassA 的表达式调用方法。它不知道您的新方法,并且您明确表示您 覆盖现有方法......所以就该调用而言,该方法基本上不存在。
    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多