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

C# 類別初探

物件導向設計以類別為核心,無論一般的應用或是 ASP.NET 技術的相關 Web 應用,均是由類別組成,現在我們建立最簡單的主控台應用程式,直接來看實際的程式碼。

類別以 class 定義,以下是最簡單的主控台應用程式的程式碼:

using System;

namespace ClassDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello OOP !");
        }
    }
}

這段列舉的程式碼是一個簡單但完整的應用程式,其中的 class Program 這一行程式碼,透過 class 關鍵字定義名稱為 Program的類別,以大括弧界定類別的內容範圍,這是最簡單的類別定義,也是這個應用程式的核心。

類別封裝完整的特定應用程式功能,相關功能的內容程式碼,都寫在大括弧界定的區塊中,例如其中的 Console.WriteLine("Hello OOP !") 這一行程式碼,建立輸出的功能,在程式執行時,會輸出 Hello OOP 這行字串 。

物件導向應用程式是由物件提供所需的功能,而物件由類別所定義,簡單的應用程式只需單一類別就夠了,例如這裏的 Program 類別,複雜的應用程式,則需要將功能進一步分拆至不同的類別,在應用程式執行的過程中,由類別產生物件執行其中的功能。

現在我們建立一個新的類別包裝這行功能程式碼,並且透過類別來輸出訊息:

namespace ClassDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ActiveMsg am = new ActiveMsg();
            am.PrintMessage("Hello OOP !");
            Console.ReadKey();
        }     
    }
    class ActiveMsg
    {
        public void PrintMessage(string msg) {
            Console.WriteLine(msg);
        }
    }
}

原來在 Program 這個類別,輸出訊息的功能程式碼,被至另外一個新的類別 ActiveMsg 中,並且以函式 PrintMessage 封裝所需的程式碼,將參數當作訊息輸出。
現在於 Program 類別中的 Main 方法,以 new 關鍵字建立 ActiveMsg 的物件實體,參照儲存至變數 am ,接下來透過 am 引用 PrintMessage() ,並將要輸出的字串 Hello OOP傳入,完成輸出。

物件導向以 new 關鍵字連接類別名稱,表示要建立類別的物件實體,並將結果儲存至變數,後續就可以透過變數引用類別中定義的函式來執行所需的功能。

定義類別

定義 C# 類別最基本的語法形式如下:

class class_name
{
  // 類別程式區塊內容 …
}

class 為定義類別所需的關鍵字, class_name 為類別的識別名稱,大括弧內部定義類別未來將支援的功能程式碼,由成員所組成,包含欄位、屬性與函式,接下來我們擴充上述的 ActiveMsg 類別,說明一個典型的類別。

class ActiveMsg1
{
    private string helloMessage; //欄位
    public void PrintMessage()  //方法
    {
        string msg = HelloMessage;
        Console.WriteLine(msg);
    }
    public string HelloMessage  //屬性
    {
        get { return helloMessage; }
        set { helloMessage = value; }
    }
}

這個類別包含了三種主要類別成員,詳述如下:

欄位

欄位是類別中定義的各種資料變數,大括內的字串變數 helloMessage 即為類別欄位,用來儲存類別內部的資料,通常會宣告為 private ,避免外部的程式碼對其進行存取。

屬性

屬性提供外部程式碼存取類別欄位所需的功能,例如其中的 HelloMessage 。

屬性以 get 存取子支援外部的存取,當外部的程式碼引用 HelloMessage 時,存取子中的程式碼 以以 return 回傳 helloMessage 欄位值。另外透過 set 支援屬性的重設,其中透過設值,將 value 表示的值設定給屬性 helloMessage,這會覆蓋掉屬性原來的值。

你可以在屬性內容定義欄位值的存取邏輯程式碼,在 get 與 set 存取子的大括弧內部進一步撰寫存取屬性所需的邏輯程式碼,這裏為了簡化說明僅作單存的存取。

方法

類別的功能由函式定義,這些函式形成了類別的方法,ShowMessage() 函式定義輸出訊息的功能,在執行過程中轉換成物件的方法,其中引用屬性 HelloMessage 取得欄位資料,將其內容字串輸出。

現在我們有一個比較完整的類別結構,嘗試運用這個類別輸出指定的訊息文字。

class Program
{
    static void Main(string[] args)
    {
        ActiveMsg1 am = new ActiveMsg1();
        am.HelloMessage = "Hello Att !";
        am.PrintMessage();
        Console.ReadKey();
    }
}

透過 new 關鍵字建立物件,完成之後,接下來便可以直接引用類別所定義的屬性或方法等成員,這個過程必須透過點 . 運算子來執行,如其中引用 HelloMessage 屬性,將指定的訊息字串設定為欄位值,接下來直接引用 PrintMessage() 將 helloMessage 欄位輸出。

Hello Att !

輸出值為一開始重設的屬性值「Hello Att !」。

類別與物件

當類別完成定義,此類別即成為一個新的型別,在程式中必須建立其實體物件,以期透過物件引用其中定義的各種成員,執行相關功能。建立實體物件必須使用 new 關鍵字,過程將會產生一個指向類別實體物件所在位置的參考,假設有一個類別 EFbook ,考慮以下的程式碼:

EFbook mybook = new EFbook() ;

mybook為任意指定的變數名稱, new 關鍵字建立 EFbook 類別的實體物件,並回傳這個物件的參考,透過 = 運算子則將此物件參考儲存至 mybook 變數。

類別物件的宣告與建立必須引用 new 關鍵字完成物件的建立,而物件變數 – 如上述的 mybook ,其中儲存的只是物件本身在記憶體位置的參考值。





沒有留言: