1.子類別如果繼承父類別,沒有選擇建構子是要實作那個父類別的建構子 預設會給它沒有方法那個
2..Net framework 會先建構父類別再建構子類別,
new子類時預設會先訪問父類中的「空建構式」,如果父類別沒有空建構式,
子類別必需明確指定使用哪一個父類別的建構式,如:base(1),初始化的動作要先完成
,否則子類跟本就不知要如何初始化,也無法得知自己繼承了哪些方法
,總之至少要能讓子類別被new起來時找到一個父類別建構式
3.當「沒有自訂任何建構式」時,
public class Parent { }
編譯器會自動加上空的建構式
public class Parent { public Parent() { } }
而當有「自定義建構式」時,編譯器則不會加上空的建構式,要你自己指定
,如果自己又沒指定哪個建構式,就會出現錯誤「沒有任何多載使用 '0' 個引數」
也就是當子類別透過不含參數的建構子建構時,
系統在建構父類別時,建構子參數會不知道要帶甚麼
4.解構時則會以反方向,先解構子類別,再解構父類別,
解構子不需由程式呼叫,.Net framework會自動執行。
範例:
//父類別 public class BaseClass { int num; //第一個建構式,無參數 public BaseClass() { HttpContext.Current.Response.Write ("< br/>這是 BaseClass()< br/>"); } //第二個建構式,帶一個參數 public BaseClass(int i) { num = i; HttpContext.Current.Response.Write ("< br/>這是 BaseClass(int i)" + num+ "< br/>" ); } public int GetNum() { return num; } } //子類別1 public class DerivedClass : BaseClass { //這個建構式會呼叫 BaseClass.BaseClass(),輸出"這是 BaseClass()" public DerivedClass() : base() { } //這會呼叫BaseClass.BaseClass(int i),輸出"這是 BaseClass(int i)" //注意:下面的int i就是後面的i public DerivedClass(int i) : base(i) { } } //子類別2 public class DerivedClass2 : BaseClass { //DerivedClass2的建構子會實作父類的DerivedClass(int i)建構子 //DerivedClass2()的括號裡不需要再寫int i,會自己去找符合的 public DerivedClass2() : base(4) { } //注意:這樣是指呼叫時傳入3,但仍會以8去叫用父類別再回來輸出3 public DerivedClass2(int i) : base(8) { HttpContext.Current.Response.Write ("< br/>" + i +"< br/>" ); } } //子類別3 public class DerivedClass3 : BaseClass { /*後面加this(5)表示要去找自己這個類別中建構式中符合的, 故會找到 第二個建構式*/ //第一個建構式 public DerivedClass3() : this(5) { HttpContext.Current.Response.Write(base.GetNum());//輸出6 } /*上面的建構式5傳進來,以6去呼叫父類別符合的建構式, 得到"這是 BaseClass(int i)6", 再執行自己,輸出5*/ //第二個建構式 public DerivedClass3(int i) : base(i + 1) { HttpContext.Current.Response.Write("< br/>" + i +"< br/>"); } } public partial class test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { /*輸出:這是 BaseClass()*/ DerivedClass md = new DerivedClass(); /*在這裡才傳參數,也可以在繼承的建構式後面傳 輸出:這是 BaseClass(int i)1*/ DerivedClass md1 = new DerivedClass(1); /*當new起來的時候直接傳4進去,找到父類別對應的建構子 輸出這是 BaseClass(int i)4*/ DerivedClass2 md2 = new DerivedClass2(); /*先用8去叫用父類別,再回來自己輸出3 /輸出:這是 BaseClass(int i)8 3 */ DerivedClass2 md3 = new DerivedClass2(3); /*輸出:這是 BaseClass(int i)6 5 6 */ DerivedClass3 md4 = new DerivedClass3(); } }
參考來源:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD2008071811002977P&fumcde=FUM20050124192253INM
http://msdn.microsoft.com/zh-tw/library/hfw7t1ce(v=vs.120).aspx
http://big5.webasp.net/article/13/12730.htm
http://big5.webasp.net/article/13/12731.htm
http://social.msdn.microsoft.com/Forums/zh-HK/233/thread/fe2d6367-205d-462d-aab8-bb5ac8fb28ff
http://bbs.itheima.com/thread-26072-1-1.html