这里出问题的条件是“在实例构造器中调用虚方法”,如果在其他地方调用虚方法,则不存在任何问题。
看下面的代码:
using System;
class Base
{
public Base()
{
Console.Write("Base construct Load!/n");
this.AA(); //注意,这是我们需要避免的动作
}
public virtual void AA()
{
Console.Write("Base AA Load!/n");
}
}
class BaseChild:Base
{
public BaseChild()
{
Console.Write("BaseChild construct Load!/n");
}
public override void AA()
{
Console.Write("Base BaseChild AA Load!/n");
}
}
class Class1
{
static void Main(string[] args)
{
BaseChild bc=new BaseChild();
Console.Read();
}
}
显示结果为:
Base construct Load!
Base BaseChild AA Load!
BaseChild construct Load!
在BaseChild还没有构造出来的时候,BaseChild中重写的AA方法已经执行了——这就是问题所在“当一个object还没有完成初始化,就让它去行使行为是没有道理的”。