Man*_*aha 6 .net c# inheritance virtual-functions
这是一个显示虚拟方法的小代码.
class A
{
public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
static void Main()
{
D d = new D();
A a = d;
B b = d;
a.F();
b.F();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码打印以下输出:
B.F
B.F
Run Code Online (Sandbox Code Playgroud)
我不明白为什么aF()会打印BF?
我认为它将打印DF,因为B类覆盖了A类的F(),然后使用"new"关键字将此方法隐藏在C类中,然后再次在D类中重写.所以最后DF保持不变.
但它不是那样做的.你能解释为什么要打印BF吗?
A a = d;
a.F();
Run Code Online (Sandbox Code Playgroud)
它将发现F()如下.
class A class B class C class D现在 F()将在A,和B.因此B.F()将被调用.在class CF()中是不同的(因为它是新的实现,并且不会从A/B覆盖).所以在第3步中,将找不到cF().在D类中,它会覆盖由C创建的新函数,因此也无法找到它.
由于新的关键字,结果代码如下(关于虚拟覆盖)
class A
{
public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
public virtual void F1() { Console.WriteLine("C.F"); }
}
class D: C
{
public override void F1() { Console.WriteLine("D.F"); }
}
Run Code Online (Sandbox Code Playgroud)