为什么不能在C#中使用重写方法? (不是关键字)
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编译。
您需要在基类中创建CallMe()
方法virtual
,然后在B
使用override
修饰符:
public abstract class A { public virtual void CallMe() { Console.WriteLine("I am A."); } } public class B : A { public override void CallMe() { Console.WriteLine("I am B."); } }
B.CallMe()
不会覆盖A.CallMe()
,它会A.CallMe()
或隐藏A.CallMe()
。 由于CallMe
是非虚方法,因此编译器根据变量的编译时类型选择调用哪个方法。 由于a的编译时类型是class A
因此它将调用A.CallMe()
。
如果你想让它调用B.CallMe()
你需要在A.CallMe()
上使用virtual
关键字,它将启用虚拟调度,应用程序将根据class B
的运行时类型调用CallMe()
方法。
请参阅隐藏inheritance