为什么不能在C#中使用重写方法? (不是关键字)

时间:2014-04-26 16:09:25

标签: c# inheritance method-overriding

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编译。

2 个答案:

答案 0 :(得分:0)

您需要在基类CallMe()中设置virtual方法,然后使用override中的B修饰符:

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."); }
}

答案 1 :(得分:0)

B.CallMe()不会覆盖A.CallMe(),它会隐藏或隐藏A.CallMe()。由于CallMe是非虚方法,因此编译器根据a变量的编译时类型选择调用哪个方法。由于a的编译时类型为class A,因此会调用A.CallMe()

如果您希望它呼叫B.CallMe(),您需要使用virtual上的A.CallMe()关键字,这将启用虚拟调度,应用程序将基于此调用CallMe()方法运行时类型a,即class B

请参阅Hiding through inheritance