[VS2010/.NET 4.0 自我修煉-02.01] 使用「類別圖表」設計列舉以及結構
本篇要介紹的是使用「類別圖表」來設計列舉 (Enumeration) 以及結構 (Struct)。
首先會對列舉跟結構做個簡單的介紹,然後再示範如何利用「類別圖表」來設計。
一、列舉跟結構是什麼?
1. 列舉 (Enumeration)
列舉的用途跟它中文翻譯的字面意義相同,
可以將內含的每個常數一一列出以供程式使用。
在列舉當中可以放入任何 char 以外的「整數型別」實體物件來當作上述的常數,
若不指定型別,則這些常數的型別預設會是 int,例如:
public enum BloodType : int
{
/// <summary>
/// A型
/// </summary>
A型,
/// <summary>
/// B型
/// </summary>
B型,
/// <summary>
/// AB型
/// </summary>
AB型,
/// <summary>
/// O型
/// </summary>
O型,
}
上面這段 code 定義了一個叫做 BloodType 的列舉,
其用法非常的簡單,只要用列舉名稱呼叫列舉常數即可,例如:
Human man = new Human(); man.BloodType = BloodType.A型;
上述的 Human 型別有一個 BloodType 列舉型別的屬性叫做 BloodType (請注意前後兩個 BloodType 不一樣),
當我們要指派 value 給這個屬性的時候,只要使用 BloodType 列舉名稱來呼叫底下的各種血型,
就像上面那段 code 裡面寫的:BloodType.A型
當我們要將某個列舉常數換成它對應的整數型別的值時,可以利用這樣的做法:int intA = (int)BloodType.A型;
而當我們要知道某個整數值對應的列舉常數名稱時,可以利用這樣的做法:string nameA = Enum.GetName(typeof(BloodType), 0);
2. 結構 (Struct)
結構在理論上的用途比列舉多很多,但實際上的用途卻跟列舉差不多。
首先來說明理論上的用途:
我們能在結構中加入建構函式、常數、欄位、方法、屬性、索引子、運算子、事件和巢狀型別等等成員,
且設計結構的方式跟類別幾乎相同,但是結構具有以下限制:
-
結構宣告內不能初始化欄位,除非將其宣告為 const 或 static。
-
結構不可宣告預設建構函式 (沒有參數的建構函式) 或解構函式。
-
結構可以宣告含有參數的建構函式。
-
結構無法繼承自類別或其他結構 (因為不能繼承,所以就不可以將結構的存取修飾詞設定為 protected)。
-
結構不能成為類別的基底 (無法被其他類別繼承)。所有結構都是從 System.Object 的 System.ValueType 直接繼承而來。
-
結構可實作介面。
-
結構是在指派時複製的。當指派結構給新變數時,就會複製所有資料,而新變數所做的任何修改都不會變更原始複本的資料。
-
結構為實值型別,而類別則是參考型別。
-
與類別不同的是,結構不需使用 new 運算子就能執行個體化。
-
結構可以用來當做可為 Null 的型別,而且可以對其指派 null 值。
二、設計列舉型別
1. 在「類別圖表」的設計檢視空白處點一下滑鼠右鍵,選擇「加入」,再選擇「列舉」
2. 編輯一下列舉名稱、存取修飾詞以及檔名,好了之後點一下「確定」按鈕
3. 之後可以看到「類別圖表」裡面出現一個新項目,而且「方案總管」也多了一支 BloodType.cs 檔案
4. 編輯一下類別細節如下:
(此處因為篇幅關係,所以省略太細節的編輯部分,但大致上都跟上一篇「[VS2010/.NET 4.0 自我修煉-01] 初探 Visual Studio 2010 Ultimate 內建的 UML 工具」所介紹的編輯方式一樣~~~)
5. 來看看編輯後的類別圖表項目以及類別檔案
三、設計結構
1. 一樣在「類別圖表」的設計檢視空白處點一下滑鼠右鍵,選擇「加入」,再選擇「結構」
2. 編輯一下結構名稱、存取修飾詞以及檔名,好了之後點一下「確定」按鈕
3. 之後可以看到「類別圖表」裡面出現一個新項目,而且「方案總管」也多了一支 BodyStruct.cs 檔案
4. 編輯一下類別細節如下:
(此處也因為篇幅關係,所以省略太細節的編輯部分,但大致上也都跟上一篇「[VS2010/.NET 4.0 自我修煉-01] 初探 Visual Studio 2010 Ultimate 內建的 UML 工具」所介紹的編輯方式一樣~~~)
但如同第一點所述,這一個步驟要注意的事情比較多,比如說:
- 結構不可宣告預設建構函式 (沒有參數的建構函式) 或解構函式
- 結構可以宣告含有參數的建構函式。
- 結構無法繼承自類別或其他結構 (因為不能繼承,所以就不可以將結構的存取修飾詞設定為 protected)。
- 結構不能成為類別的基底 (無法被其他類別繼承)。
- 結構可實作介面。
四、結論
其實還是跟前一篇的結論一樣,筆者比較想要講解的是結構跟介面本身,
IDE 就是拿來當作輔助工具,所以請不要打筆者~~~ XDDD