为什么是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编译。

为什么是can';t在C#中使用重写方法吗?(与关键字无关)

您需要在基类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()方法。

请参阅通过继承隐藏