抽象类继承混淆

时间:2014-11-30 18:50:08

标签: c# oop

我有一个D类继承自C抽象类并写入与控制台相关的消息。我希望看到" D"在我的控制台窗口,但它写了" B"。我认为C类中的虚拟关键字违反了规则。我不明白为什么。谁能解释一下?

  class Program
{
    static void Main(string[] args)
    {
        A obj = new D();
        obj.Write();
        Console.Read();
    }
}

public abstract class A
{
    public virtual void Write()
    {
        Console.WriteLine("A");
    }
}

public abstract class B : A
{
    public override void Write()
    {
        Console.WriteLine("B");
    }
}

public abstract class C : B
{
    public virtual void Write()
    {
        Console.WriteLine("C");
    }
}

public class D : C
{
    public override void Write()
    {
        Console.WriteLine("D");
    }
}

2 个答案:

答案 0 :(得分:2)

问题是C没有覆盖类A中的函数。编译器会警告您需要new关键字。如果您还在课程override中使用C,则其效果与您预期的相同。

或者如果您将A obj = new D();替换为D obj = new D();,您将获得相同的结果。

答案 1 :(得分:2)

如果您倾听它,您的编译器在这方面做得非常好:

warning CS0114:

'C.Write()' hides inherited member 'B.Write()'.
  

要使当前成员覆盖该实现,请添加覆盖关键字。

     

否则请添加关键字。

您在C上使用virtual而不是override的事实将导致此方法的new的默认行为,从而打破了继承链。