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();
}
}
7, 不能把基類的構造函數定義為private
見下例,由于無法通路基類不帶參的構造函數,編譯時也會報錯
class baseClass
{
private baseClass()
{
Console.WriteLine("baseClass");
}
}