我有一个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");
}
}
答案 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
的默认行为,从而打破了继承链。