方法隐藏和"新"关键字

Gur*_*epS 3 c#

对于我的生活,尽管有关于它的所有文档,但我从未理解"方法隐藏".

覆盖意味着在派生类中使用实现.我是否认为隐藏(通过使用"new"关键字")将意味着使用基类定义?在这种情况下,那么为什么要在继承的类中编写方法?

实际上我的两个问题是:

  1. 隐藏在压倒一切的对立面?
  2. 新关键字(用于隐藏)做什么以及何时/何地使用它?基类?一个继承的类?
  3. 有用的现实世界的例子吗?

Jus*_*ner 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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

以下代码将产生:

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!
Run Code Online (Sandbox Code Playgroud)