为什么是can';t在C#中使用重写方法吗?(与关键字无关)
本文关键字:方法 重写 关键字 can 为什么 | 更新日期: 2023-09-27 18:00:13
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编译。
您需要在基类virtual
中创建CallMe()
方法,然后在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()
。由于CallMe
是一个非虚拟方法,编译器根据a
变量的编译时类型来选择调用哪个方法。由于a
的编译时类型是class A
,它将调用A.CallMe()
。
如果希望它调用B.CallMe()
,则需要在A.CallMe()
上使用virtual
关键字,这将启用虚拟调度,其中应用程序将基于a
的运行时类型(即class B
(调用CallMe()
方法。
请参阅通过继承隐藏