在构造函数中调用虚拟方法

与 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 警告)。通常这被认为是不好的做法。