在C#中重写,使后面的两个方法成为虚拟方法
本文关键字:方法 两个 虚拟 重写 | 更新日期: 2023-09-27 18:00:41
这是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
类覆盖A
,C
覆盖B
,那么它调用C
的方法。
请解释。
在第一种情况下,B正在阴影A,而C正在覆盖B中的阴影。因此,只要引用类型为A,它就会调用A方法。
在第二种情况下,B覆盖A,C覆盖B(所以它覆盖A)。
请参阅:遮蔽和覆盖之间的差异
检查编译器警告:
警告1'。。Program.B.callme()'隐藏继承的成员'。。Program.A.callme()'。若要使当前成员重写实现,添加override关键字。否则添加新的关键字。。''程序.cs 44 33测试
它声明B中的方法隐藏A中的方法。当您覆盖C中的方法时;它只是覆盖B中的方法而不是A中的方法(编译器假设B类中的callme
是一个新方法)。因此,当您调用A.callme
时,由于A中的方法没有被覆盖,它会返回"this is A"。