抽象类继承混淆

本文关键字:继承 抽象类 | 更新日期: 2023-09-27 18:32:43

我有一个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");
    }
}

抽象类继承混淆

如果你听的话,你的编译器已经做得很好了:

warning CS0114:
'C.Write()' hides inherited member 'B.Write()'.

若要使当前成员重写该实现,请添加 override 关键字。

否则,请添加新关键字。

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

问题是C不会覆盖类A中的函数。编译器会向您发出警告,指出 new 关键字是必需的。如果你也在类C中使用override,它的工作方式就像你预期的那样。

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