我认为 ArsenMkrt 的示例并不完全正确,至少它没有完全解释隐藏功能。通过从 B 类的 Foo 方法中删除 new 关键字,您仍然可以获得输出
A::Foo()
B::Foo()
A::Foo()
在像 Java 这样的编程语言中,所有方法都是“虚拟的”,您希望得到输出
A::Foo()
B::Foo()
B::Foo()
由于实例化,采用上述 ArsenMkrt 的代码
A a;
B b;
a = new A();
b = new B();
a.Foo();
b.Foo();
a = new B(); //<< Here
a.Foo();
然而,在他的示例中,您仍然会得到“A::Foo()”,因为在 C# 中方法默认不是虚拟的,因此方法 B::Foo() 会自动隐藏 A 的 Foo()。要实现多态行为,必须改为如下编写:
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public override void Foo() { Console.WriteLine("B::Foo()"); }
}
现在是“new”关键字出现的地方。实际上,当您离开 B::Foo() 中的“覆盖”时,您将再次隐藏 A::Foo(),这意味着您不会覆盖它的默认值行为并且您没有实现多态性,即您再次获得“A::Foo()”作为输出。可以通过放置“新”关键字来实现相同的效果 - 这就是我不能 100% 理解你为什么必须放置它的地方 - 就像..
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public new void Foo() { Console.WriteLine("B::Foo()"); }
}
然后你又得到了输出
A::Foo()
B::Foo()
A::Foo()