【公告】網站目前停止所有的課程訂閱服務,原有學員權益不受影響,造成不便還請見諒,我們正在打造更多課程以及圖書,包含 Python 為主的課程主題,未來將會合併且擴充目前的課程內容,提供全新課程訂閱服務,感謝學員的支持。
【公告】《Entity Framework 實務精要》 絕版優惠學習活動,是針對最後一批少量書籍絕版的短期特別活動,只提供 20 個名額(剩 5 名),教學影片要在今年暑假過後才會重新開放訂閱,並沒有提供之前單獨購書的讀者,還請見諒, 如果您需要教學影片,屆時再請參與,也感謝讀者學員的支持,我們正在開發更多的教學內容,歡迎與我們一起努力。
《Entity Framework 實務精要》 絕版優惠學習活動》

類別物件建立與建構函式

類別物件建立的過程如果需要進行初始化的設定,相關的功能程式碼必須寫在一種稱為「建構函式」的特殊函式中,其中的程式碼就會在物件建立時候自動執行,完成初始化作業。

建構函式以類別的名稱命名,因此當我們使用 new 關鍵字建立物件,後面緊接著類別名稱即表示建構式的呼叫,應用程式隨即執行其中的程式碼,例如以下這一行程式碼:

Book book1 = new Book() ;

其中建立一個 Book 物件 book ,建構函式 Book() 被執行。

類別不一定需要執行自訂的初始化,因此定義建構函式是選擇性的,在沒有設計任何建構函式的情形下,以 new 關鍵字建立物件的過程中,類別自己會建立隱含的預設建構函式,進行預設的初始化行為。

定義建構函式

建構函式沒有回傳值,且需宣告為 public ,允許外部程式碼建立物件時執行。

public ClassName(t p1, t2 p2, …)
{
     … // 類別初始化程式碼
}

ClassName 是類別的名稱,並且沒有任何回傳型別名稱,參數與一般的函式相同,可以根據需求加入,不需要的話保持空白括弧即可。

以下的程式碼建立一個 Book 類別,並且於其中定義建構函式:

class Program
{
    static void Main(string[] args)
    {
        Book book = new Book();
        Console.ReadKey();
    }
}
class Book
{
    public Book()
    {
        Console.WriteLine(" Book 物件建立 !");
    }
}

建構函式中,輸出一行說明訊息以表示Book物件被建立,在主程式中配置建立Book物件的程式碼,輸出以下的結果:

Book 物件建立 !

從這行輸出訊息可以看到 new 建立物件的過程中,確實執行了Book() 建構函式。以下進一步擴充範例內容:

class Book
{
    string title = "";
    string ISBN = "";
    int price = 0;
    public Book(string t, string i, int p)
    {
        title = t;
        ISBN = i;
        price = p;
        Console.WriteLine("Book 物件建立 !");
    }
    public string BookInfo()
    {
        string info = title + "\n" +
            ISBN + "\n" +
            price;
        return info;
    }
}

建構式這一次接受三組參數,並在其中初始化三個用來表示此 Book 物件所封裝的書籍資訊欄位,分別為代表書名的 title ,代表 ISBN 碼的 ISBN 欄位以及表示價格的 price ,另外定義 BookInfo() 函式取出三個欄位值合併回傳以方便建構函式的測試。

在主程式中重新建立擴充的 Book 類別物件,呈現執行的效果。

class Program
{
    static void Main(string[] args)
    {
        string title = "Entity Framework 實務精要";
        string ISBN = "9789869347501";
        int price = 650;
        Book book = new Book(title, ISBN, price);
        string info = book.BookInfo();
        Console.WriteLine(info);
        Console.ReadKey();
    }
}

這一次在建構式函式傳入三個變數值,然後執行 BookInfo() 方法函式,於主控台輸出回傳的字串。

Book 物件建立 !
Entity Framework 實務精要
9789869347501
650

輸出結果中可以看到建構函式針對各欄位的初始化效果。

建構函式多載

建構函式僅管是一種特殊的函式,但依然支援多載,你可以為一個物件建立不同版本的建構函式,原理同一般的函式。

class Book
{
    string title = "";
    string ISBN = "";
    int price = 0;
    bool published = false;
    public Book(string t, string i)
    {
        title = t;
        ISBN = i;
    }
    public Book(string t, string i, int p)
    {
        title = t;
        ISBN = i;
        price = p;
        published = true;
        Console.WriteLine("Book 物件建立 !");
    }
    public string BookInfo()
    {
        string info = title + "\n" + ISBN + "\n";
        if (published == true)
        {
            info += price;
        }
        else
        {
            info += "未上市";
        }
        return info;
    }
}

現在的Book類別,包含另外一個只有兩個參數的建構函式版本,使用這個版本建立的Book 物件,表示尚未出版的圖書,而原來的版本則將新的欄位 published 設定為 true ,表示已出版,在預設的情形下,這個欄位值是 false 。

進一步調整 BookInfo() 函式,判斷 published 欄位,如果是 true  則輸出包含價格的書籍資訊,否則標示為「未上市」。

class Program
{
    static void Main(string[] args)
    {
        string title = "Entity Framework 實務精要";
        string ISBN = "9789869347501";
        int price = 650;
        Book book1 = new Book(title, ISBN, price);
        string info1 = book1.BookInfo();
        Console.WriteLine(info1);
        Console.WriteLine("\n");

        string title2 = "專業 ASP.NET MVC 開發";
        string ISBN2 = "1234567890123";
        Book book2 = new Book(title2, ISBN2);
        string info2 = book2.BookInfo();
        Console.WriteLine(info2);

        Console.ReadKey();
    }
}

現在主程式中的程式碼,分別透過兩個版本的建構式,建立不同的 Book 物件,其中 book2 引用的是兩個參數的版本。

Book 物件建立 !
Entity Framework 實務精要
9789869347501
650

專業 ASP.NET MVC 開發
1234567890123
未上市

在這個輸出結果中,可以清楚比較引用不同版本建立物件之後的差異。

明確定義預設建構式

必須注意一旦類別定義了建構函式,就必須明確的引用任一定義的版本,否則會導致錯誤,例如以下的程式碼:

Book book = new Book();

由於現在有兩個包含參數的建構式版本,不會再自動引用預設的無參數版本,因此這一行程式碼會出現「'Book' 未包含使用 0 個引數的建構函式 …」的錯誤訊息導致程式執行失敗。

如果還是想要提供預設的建構函式,只要明確宣告無參數的多載版本即可。

class Book
{
    string title = "";
    string ISBN = "";
    int price = 0;
    bool published = false;

    public Book()
    {
        //
    }
    public Book(string t, string i)
    {
        //
    }
    public Book(string t, string i, int p)
    {
        //
    } 
}

其中第一組建構函式是無參數的多載版本,如此一來我們就可以順利的透過無參數版本的建構函式建立 Book 物件。


沒有留言: