經典面試題:給定基類與派生類均含 readonly 字段初始化器與構造函數,實例化派生類時輸出順序為何?
class Foo
{
public Foo(string s) { Console.WriteLine("Foo constructor: {0}", s); }
public void Bar() { }
}
class Base
{
readonly Foo baseFoo = new Foo("Base initializer");
public Base() { Console.WriteLine("Base constructor"); }
}
class Derived : Base
{
readonly Foo derivedFoo = new Foo("Derived initializer.");
public Derived() { Console.WriteLine("Derived constructor"); }
}
class Program
{
static void Main() { new Derived(); }
}
直覺以為:Base initializer → Base constructor → Derived initializer → Derived constructor。
實際輸出:
Foo constructor: Derived initializer. Foo constructor: Base initializer Base constructor Derived constructor
下篇將通過反例深入剖析設計動機。