您显示的第二个示例隐藏了父级的GetData,它并未覆盖它。
实施例:
private class Base
{
public virtual void Test()
{
Console.WriteLine("Base");
}
public void Test2()
{
Console.WriteLine("Base");
}
}
private class Derived : Base
{
public override void Test()
{
Console.WriteLine("Derived");
}
public void Test2()
{
Console.WriteLine("Derived");
}
}
static void Main()
{
Base b = new Base();
Derived d = new Derived();
Base dInB = new Derived();
b.Test();
d.Test();
dInB.Test();
b.Test2();
d.Test2();
dInB.Test2();
Console.ReadKey(true);
}
它输出:
Base // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base // Base.Test2()
Derived // Derived.Test2()
Base // You think you're calling Derived.Test2(), but you actually call Base.Test2()
实际上这个样品是无效的,因为它应该在派生类使用new
关键字public new void Test2()
。
它的作用就像操作符重载一样。它实际上并没有覆盖任何东西。当你有确切的类型Derived
它调用新的方法。
你必须非常小心隐藏成员,它完全不像重写(类)或实现(接口)。只有当你有确切的类型它会调用new
方法,否则它仍然会调用基类型的方法!
您是否看到B.GetData()下的波浪状?你在视图+错误列表中看到警告吗?很难错过,当你知道你在做什么时,使用* new *关键字。 – 2012-01-11 23:56:29
在第一个例子中,B的方法不能是私有的。它不会编译。 – TrueWill 2012-01-11 23:58:14