【发布时间】:2014-04-26 16:09:25
【问题描述】:
public abstract class A
{
public void CallMe() { Console.WriteLine("I am A."); }
}
public class B : A
{
new public void CallMe() { Console.WriteLine("I am B."); }
}
class Program
{
static void Main(string[] args)
{
A a = new B();
a.CallMe();
}
}
输出是“我是 A”。
为什么会这样?这合理吗?
由 Visual Studio 2012 编译。
【问题讨论】:
-
您实际上并没有覆盖,
new关键字隐藏。使用override -
@user3576363 它没有改变结果,因为您将其称为
A类型。如果您改为使用B b = new B(); b.CallMe();,您将看到B消息。至于“为什么”它会这样工作,那是因为它就是这样设计的。 -
和
virtual在基地 -
"new" 的意思是“我希望这是一种与旧方法同名的新方法,而不是覆盖旧方法”。如果这不是你的意思,请不要那样说。您正在调用旧方法。
-
编译器已经告诉你你做错了。您添加了“new”来关闭编译器,但这并没有阻止您做错事。下次先google一下错误信息。
标签: c# inheritance overriding