为什么会这样.One() 从类 B 调用覆盖器方法,而不是从类 A 调用虚拟方法
本文关键字:方法 调用 虚拟 覆盖 One 从类 为什么 | 更新日期: 2023-09-27 17:58:27
class A
{
public virtual int one()
{
return 100;
}
public virtual int two()
{
return 200;
}
public virtual int three()
{
return this.one();
}
}
class B : A
{
public override int one()
{
return 300;
}
public override int two()
{
return this.one();
}
public override int three()
{
return base.three();
}
}
class Program
{
static void Main(string[] args)
{
A b = new B();
Console.WriteLine(b.three());
}
}
为什么此代码返回"300"?
因为它是virtual
.
virtual
方法的全部意义在于始终调用重写的版本。
这就是override
的定义。
virtual
关键字基本上意味着"子类可以覆盖此方法"。
override
关键字基本上意味着"我的基类有一个我正在重新定义的虚拟方法">
我认为您的困惑是因为this.one()
是从类A
调用的. 但是,this
仍然引用类B
的一个实例,这就是调用B
方法的原因。
@SLaks说了什么。
但具体来说,b.three()
调用B.three
,调用A.three
,调用B.one
。
我认为当你说返回 base.three((; 在被覆盖的方法中,你应该准确地调用 return this.three((; 其他明智的做法是,您将访问基类,即 A。