C# 面向对象的编程问题 - 覆盖方法
C# Object oriented proggramming issue - overriding methods
在 C# 中考虑以下代码:
public class A
{
public A()
{
Console.WriteLine("A");
}
public virtual void One()
{
Console.WriteLine("One of A");
}
public virtual void Two()
{
One();
}
}
public class B : A
{
public B()
{
Console.WriteLine("B");
}
public override void One()
{
Console.WriteLine("One of B");
}
public override void Two()
{
Console.WriteLine("Two of B");
}
public void Three()
{
base.Two();
}
}
和主要的:
A a3 = new B(); //"A" and then "B"
a3.Two();' //"Two of B"
((B)a3).Three(); //"One of B"
为什么主程序最后一行写'One of B'?
为什么它执行One()时会转到B的One()?
分解每个方法调用的内容 -
((B)a3).Three();
来电
B.Three();
调用
A.Two();
调用
A.One();
但是A.One
是virtual,这意味着系统必须查看对象的actual类型确定 将调用哪个 One
的运行时。
由于 a3
引用的对象是 B
(即使您 声明 它是 A
变量引用,B.One()
被调用。
因为你的变量a3
是类型B,并且因为类型A的Two方法被标记为virtual
,所以编译器推断应该调用的方法是类型B对[=的重写实现12=].
因为 class A 的方法 One() 被声明为虚拟的并且它在 class B 中找到了一个覆盖,所以它选择了覆盖。
在 C# 中考虑以下代码:
public class A
{
public A()
{
Console.WriteLine("A");
}
public virtual void One()
{
Console.WriteLine("One of A");
}
public virtual void Two()
{
One();
}
}
public class B : A
{
public B()
{
Console.WriteLine("B");
}
public override void One()
{
Console.WriteLine("One of B");
}
public override void Two()
{
Console.WriteLine("Two of B");
}
public void Three()
{
base.Two();
}
}
和主要的:
A a3 = new B(); //"A" and then "B"
a3.Two();' //"Two of B"
((B)a3).Three(); //"One of B"
为什么主程序最后一行写'One of B'? 为什么它执行One()时会转到B的One()?
分解每个方法调用的内容 -
((B)a3).Three();
来电
B.Three();
调用
A.Two();
调用
A.One();
但是A.One
是virtual,这意味着系统必须查看对象的actual类型确定 将调用哪个 One
的运行时。
由于 a3
引用的对象是 B
(即使您 声明 它是 A
变量引用,B.One()
被调用。
因为你的变量a3
是类型B,并且因为类型A的Two方法被标记为virtual
,所以编译器推断应该调用的方法是类型B对[=的重写实现12=].
因为 class A 的方法 One() 被声明为虚拟的并且它在 class B 中找到了一个覆盖,所以它选择了覆盖。