无论如何,我都从未理解“方法隐藏”,尽管有所有相关的文档。
覆盖意味着使用派生类中的实现。 如果我正确地认为(通过使用“new”关键字)隐藏将意味着使用基类定义。 在这种情况下,那么为什么要在继承类中编写一个方法?
实际上,我的两个问题是:
- 隐藏是覆盖的反义词吗?
- 用于隐藏的 new 关键字是什么以及何时/在哪里使用? 基类? 继承类?
- 任何有用的现实世界的例子?
无论如何,我都从未理解“方法隐藏”,尽管有所有相关的文档。
覆盖意味着使用派生类中的实现。 如果我正确地认为(通过使用“new”关键字)隐藏将意味着使用基类定义。 在这种情况下,那么为什么要在继承类中编写一个方法?
实际上,我的两个问题是:
你的理解有些偏差。
首先,覆盖一个方法意味着即使将实例强制转换为其基本类型,新的实现也将被使用,因为虚方法表中存在正确的条目。
当隐藏方法时,即使将实例转换为其基本类型,也将使用基本实现,因为虚方法表中没有条目。
考虑以下类定义:
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!
var bAsBase = b as Base; // 不是 a
- vlad