在建構函式中呼叫虛擬方法

與 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 警告)。通常這被認為是不好的做法。