在建構函式中呼叫虛擬方法
與 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 警告)。通常這被認為是不好的做法。