在C#中重写,使两个后续方法虚拟
这是一个在C#中压倒一切的问题 当我使用以下代码时:在C#中重写,使两个后续方法虚拟,c#,overriding,C#,Overriding,这是一个在C#中压倒一切的问题 当我使用以下代码时: class Program { class A { public virtual void callme() { Console.WriteLine("this is A"); } } class B : A { public new virtual void callme() {
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();
}
}
输出:这是一个
当我使用:
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();
}
}
输出:这是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”。这正是您不应忽略编译器警告的原因……“当您在C中重写该方法时,它只会重写B中而不是A中的方法(编译器假定您在类B中调用我是一个新方法)”。。。这是不正确的。在本例中,只有虚方法可以被重写,所以类中的方法被重写(而不是B)。类C刚从类B继承了此方法,而类B从父类A继承了此方法。B中的@Fabjan方法也是虚拟的,请检查问题中的第一个示例,它隐藏了A中的实现。您的假设不正确;无论您是否使用new关键字,B中的方法都是一个新方法,与a中的方法没有任何关系。哦,对不起。没有注意到(再次投票给你)