close

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

arrow
arrow
    全站熱搜

    小豆干 發表在 痞客邦 留言(1) 人氣()