方法隐藏和“new”关键字

3

无论如何,我都从未理解“方法隐藏”,尽管有所有相关的文档。

覆盖意味着使用派生类中的实现。 如果我正确地认为(通过使用“new”关键字)隐藏将意味着使用基类定义。 在这种情况下,那么为什么要在继承类中编写一个方法?

实际上,我的两个问题是:

  1. 隐藏是覆盖的反义词吗?
  2. 用于隐藏的 new 关键字是什么以及何时/在哪里使用? 基类? 继承类?
  3. 任何有用的现实世界的例子?
1个回答

15

你的理解有些偏差。

首先,覆盖一个方法意味着即使将实例强制转换为其基本类型,新的实现也将被使用,因为虚方法表中存在正确的条目。

当隐藏方法时,即使将实例转换为其基本类型,也将使用基本实现,因为虚方法表中没有条目。

考虑以下类定义:

public class Base
{
    public virtual void Say()
    {
        Console.WriteLine("Hello World!");
    }
}

public class A : Base
{
    public new void Say()
    {
        Console.WriteLine("42");
    }
}

public class B : Base
{
    public override void Say()
    {
        Console.WriteLine("Goodbye, Cruel World!");
    }
}
以下代码将会产生:
var a = new A();
var b = new B();
var aAsBase = a as Base;
var bAsBase = b as Base;

a.Say(); // 42
aAsBase.Say(); // Hello World!

b.Say(); // Goodbye, Cruel World!
bAsBase.Say(); // Goodbye, CruelWorld!

第二个代码片段的第4行有一个拼写错误:var bAsBase = b as Base; // 不是 a - vlad
但是为什么要使用“new”关键字呢?在我的实验中,它即使没有也能正常工作。唯一的区别是编译器会发出警告。 - mathgenius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接