这是一个覆盖C#的问题。
当我使用以下代码时:
class Program
{
class A
{
public virtual void callme()
{
Console.WriteLine("this is A");
}
}
class B : A
{
public new virtual void callme()
{
Console.WriteLine("this is B");
}
}
class C : B
{
public override void callme()
{
Console.WriteLine("this is C");
}
}
static void Main(string[] args)
{
A obj = new C();
obj.callme();
Console.ReadKey();
}
}
输出: This is A
当我使用时:
class Program
{
class A
{
public virtual void callme()
{
Console.WriteLine("This is A.");
}
}
class B : A
{
public override void callme()
{
Console.WriteLine("This is B.");
}
}
class C : B
{
public override void callme()
{
Console.WriteLine("This is C.");
}
}
static void Main(string[] args)
{
A obj = new C();
obj.callme();
Console.ReadKey();
}
}
输出: This is C.
因此,如果我在后续类(A
以及B
)中创建一个虚拟方法,为什么它调用最后一个方法,如果B
类重写{{ 1}}和A
覆盖C
然后调用B
的方法。
请解释。
答案 0 :(得分:2)
在第一种情况下,B是阴影A而C则覆盖B中的阴影。因此,只要参考类型为A,它就会调用A方法。
在第二种情况下,B覆盖A,C覆盖B(因此覆盖A)。
答案 1 :(得分:1)
检查编译器警告:
警告1' .. Program.B.callme()'隐藏继承的成员 ' .. Program.A.callme()&#39 ;.使当前成员覆盖该成员 实现,添加override关键字。否则添加新的 关键词。 .. \ Program.cs 44 33测试
它声明B中的方法隐藏了A中的方法。当你在C中覆盖方法时;它只是覆盖B中的方法而不是A中的方法(编译器假定您在B类中callme
是一个新方法)。因此,当您致电A.callme
时,由于A中的方法未被覆盖,因此返回"这是A"。