在构造函数中调用虚拟方法
与 C#中的 C++不同,你可以从类构造函数中调用虚方法(好吧,你也可以在 C++中使用,但最初的行为是令人惊讶的)。例如:
abstract class Base
{
protected Base()
{
_obj = CreateAnother();
}
protected virtual AnotherBase CreateAnother()
{
return new AnotherBase();
}
private readonly AnotherBase _obj;
}
sealed class Derived : Base
{
public Derived() { }
protected override AnotherBase CreateAnother()
{
return new AnotherDerived();
}
}
var test = new Derived();
// test._obj is AnotherDerived
如果你来自 C++背景,这是令人惊讶的,基类构造函数已经看到派生类的虚方法表!
注意 :派生类可能尚未完全初始化(它的构造函数将在基类构造函数之后执行)并且这种技术很危险(还有一个 StyleCop 警告)。通常这被认为是不好的做法。