这是一段显示虚拟方法的小代码。
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();
}
}
此代码打印以下输出:
B.F
B.F
我不明白为什么 a.F() 会打印 B.F ?
我认为它会打印 D.F,因为 B 类覆盖了 A 类的 F(),然后使用“new”关键字将此方法隐藏在 C 类中,然后它再次在 D 类中被覆盖。所以最后 D.F 保留下来.
但它并没有这样做。你能解释一下它为什么打印 B.F 吗?
最佳答案
A a = d;
a.F();
它将按如下方式找到F()
。
A 类第一名
- 然后在
B 类
- 然后在
C 类
- 然后在
D类
现在 F()
将在 A
和 B
中找到。因此 B.F()
将被调用。在 class C
中,F() 是不同的(因为它是新的实现并且不会从 A/B 覆盖)。所以在第 3 步中,将找不到 c.F()。在D类中,它覆盖了C创建的新函数,因此也不会被发现。
由于 new 关键字,生成的代码如下(关于虚拟覆盖)
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"); }
}
关于c# - 需要了解以下 C# 虚方法代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356287/