1,在使用構造函數的時候,作為派生類會有某些特殊問題。其根源就是創建派生類的時候會有多個構造函數起作用。
2,C#中實例化的類的構造函數本身不能初始化類,還必須調用基類的構造函數。
3,構造函數的調用順序是自上向下的,(實際上是編譯器先自下而上的尋找構造函數,然后再自上而下的執行)
直到達到要實例化的類為止,在此過程中,每一個構造函數都初始化它們自己的類中的字段。
用一個簡單例子說明這一問題
class baseClass { public baseClass() { Console.WriteLine("baseClass"); } } class childClass : baseClass { public childClass() { Console.WriteLine("childClass"); } } class Program { static void Main(string[] args) { childClass child = new childClass(); /* * 結果是 * baseClass * childClass */ Console.Read(); } }
4,正是基於這樣一種順序(基類的構造函數最先被調用),
派生類的構造函數可以在執行的過程中掉用它可以訪問的基類方法啊,屬性和其他成員
5,另外我們還可以這樣定義childClass的構造函數,結果一致。base不帶參數
public childClass() : base() { Console.WriteLine("childClass"); }
實際上,編譯器會自動調用基類中的不帶參數的構造函數,而我們一旦為類定義了構造函數,
無論是否帶有參數,那么類都不會再自動生成默認的構造函數,
所以這個時候我們就要自己寫這個默認的不帶參數的構造函數,
或者我們通過給base傳遞參數來告訴編譯器指定基類的構造函數。見下例
class baseClass { private int a; public baseClass(int i) { a = i; } } class childClass : baseClass { public childClass(int i) : base(i) { } } class Program { static void Main(string[] args) { childClass child = new childClass(10); Console.Read(); } }