这里出问题的条件是“在实例构造器中调用虚方法”,如果在其他地方调用虚方法,则不存在任何问题。
看下面的代码:
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还没有完成初始化,就让它去行使行为是没有道理的”。
博客指出在实例构造器中调用虚方法会出现问题,而在其他地方调用则无问题。通过代码示例展示,在BaseChild未构造完成时,其重写的AA方法已执行,说明让未完成初始化的object行使行为不合理。
331

被折叠的 条评论
为什么被折叠?



