new
修饰符导致成员隐藏,从而破坏了类层次结构中的多态关系。的SayHi
方法B
被视为与 's不同(而不是覆盖)A
(因此选择单词“new”作为关键字)。C
's 方法然后覆盖B
's,而不是A
's(仍然隐藏)。
因此,当您通过引用调用实例SayHi
时,运行时会将其解析为类型,而不是类型(其中是从 继承的“新”方法)。C
A
A
C
SayHi
B
另一方面,如果您要运行:
B p = new C();
p.SayHi();
…你会得到预期的多态结果:
From C
编辑:由于您请求了一个用例,这是一个。在 .NET Framework 2.0 中引入泛型之前,成员隐藏有时被用作更改派生类中继承方法的返回类型的一种方法(在重写时不能这样做),以返回更具体的类型。例如:
class ObjectContainer
{
private object item;
public object Item
{
get { return item; }
set { item = value; }
}
}
class StringContainer : ObjectContainer
{
public new virtual string Item
{
get { return base.Item as string; }
set { base.Item = value as string; }
}
}
class QuotedStringContainer : StringContainer
{
public override string Item
{
get { return "\"" + base.Item + "\""; }
}
}
类的Item
属性ObjectContainer
返回一个普通的object
. 但是,在 中,这个继承的属性被隐藏了,而是StringContainer
返回 a 。string
因此:
ObjectContainer oc = new StringContainer();
object o = oc.Item; // Valid, since ObjectContainer.Item is resolved
string s1 = oc.Item; // Not valid, since ObjectContainer.Item is still resolved
string s2 = ((StringContainer)oc).Item;
// Valid, since StringContainer.Item is now resolved
该类QuotedStringContainer
覆盖 的Item
属性StringContainer
,继承其string
返回类型;但是,它仍然隐藏在 的object
-returningItem
属性中ObjectContainer
。如果不是这样,就没有办法调和它们不同的返回类型……</p>
ObjectContainer oc = new QuotedStringContainer();
object o = oc.Item; // Valid, since ObjectContainer.Item is resolved
string s1 = oc.Item; // Not valid, since ObjectContainer.Item is still resolved
string s2 = ((StringContainer)oc).Item;
// Valid, since QuotedStringContainer.Item is now resolved
// (polymorphism!)
string s3 = ((QuotedStringContainer)oc).Item;
// Valid, since QuotedStringContainer.Item is now resolved