问题描述
|
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 \”?
解决方法
因为是ѭ1。
virtual
方法的全部要点是您总是调用覆盖版本。
, 那是ѭ3的定义。
关键字1基本上意味着\“子类可以覆盖此方法\”。
关键字override
的基本含义是,“我的基类有一个我要重新定义的虚拟方法”
我认为您的困惑是因为this.one()
被称为A
类。但是,this
仍然引用类B
的实例,这就是为什么调用B
上的方法的原因。
, @SLaks说什么。
但具体地说,b.three()
调用B.three
,which12ѭ调用A.three
,which13ѭ又调用B.one
。
, 我想当您说return base.three();在重写的方法中,您应该明智地调用return this.three();。否则,您将访问基类A。