在我的一生中,尽管有所有文档,但我从未理解过“方法隐藏”。
覆盖意味着使用派生类中的实现。我是否认为隐藏(通过使用“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!