抽象类继承混淆
本文关键字:继承 抽象类 | 更新日期: 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();
,则会得到相同的结果。