作为一名Java开发人员,我当时有点意外,当我有一天意外地使用了新的关键字而不是覆盖了。C#允许在虚拟方法上使用新的用例是什么?
看来关键字删除了继承树中该级别的方法的“虚拟性”,因此调用子类的实例上的方法,该子类降级到父类,将无法解析到子类中的方法实现。
这种行为的实际用例是什么?
澄清:我了解父母不是虚拟时使用新的。我更加好奇为什么编译器允许合并新的和虚拟的。
下面的例子说明了区别:
using System;
public class FooBar
{
public virtual void AAA()
{
Console.WriteLine("FooBar:AAA");
}
public virtual void CCC()
{
Console.WriteLine("FooBar:CCC");
}
}
public class Bar : FooBar
{
public new void AAA()
{
Console.WriteLine("Bar:AAA");
}
public override void CCC()
{
Console.WriteLine("Bar:CCC");
}
}
public class TestClass
{
public static void Main()
{
FooBar a = new Bar();
Bar b = new Bar();
Console.WriteLine("Calling FooBar:AAA");
a.AAA();
Console.WriteLine("Calling FooBar:CCC");
a.CCC();
Console.WriteLine("Calling Bar:AAA");
b.AAA();
Console.WriteLine("Calling Bar:CCC");
b.CCC();
Console.ReadLine();
}
}
这将产生以下的输出:
Calling FooBar:AAA
FooBar:AAA
Calling FooBar:CCC
Bar:CCC
Calling Bar:AAA
Bar:AAA
Calling Bar:CCC
Bar:CCC
很好的例子。这是一个非常方便的选择,但我认为它有足够的缺陷来保证编译警告。 – PeterR 2009-09-24 16:35:54
好吧,如果你*没有'new',但你隐藏了一个方法,那么你会得到一个编译警告。这个想法是,如果你明确地*添加一个修饰符,那应该是一个标志,你的意思是:) – 2009-09-24 16:53:11