C# 程式設計
產品編號:F8333
定價:580元
黃昕暐 譯
|
|
本期書摘--C# 程式設計
幾個月前, 我在寫程式時遇到一個狀況, 就是類別中有一個資
料成員 (Filename) 的內容可以從另一個資料成員 (Name) 衍
生出來, 所以我決定採用C++中所謂的屬性模式 (Property
Pattern) , 為這個衍生自其他資料成員的資料成員撰寫了一
個getFilename ()函式, 以便在這個函式中以Name為基礎, 運
算出Filename的內容。接下來, 我必須檢視一遍所有曾經寫好
的程式碼, 並且把存取該資料成員的地方都改成叫用
getFilename (), 這可花了我好長一段時間, 因為這個專案實
在很大。
除此之外, 我也必須記得要存取檔案名稱時, 得叫用
getFilename ()函式, 而不是直接存取類別中用來儲存檔案名
稱的成員。這感覺起來有點煩, 每次要存取檔案名稱時, 我就
必須注意到它不再是個單純的資料成員, 而是相對應有一個函
式。相同的道理, 我也必須改成叫用setFilename ()函式來設
定檔名。
當您在檢視這樣的類別時, getFilename ()與setFilename ()
事實上是代表了一個「虛擬資料成員」的邏輯關係並不是很明
顯, 尤其是類別的成員是以常見的字母順序排列的時候。因此
, 這種屬性模式的設計方式對於類別的撰寫者固然是不錯, 可
是對於類別的使用者來說就有點混亂了。
C#在語言的層次上加入了屬性 (Properties) 的機制。對於類
別的使用者來說, 屬性看起來像是類別的資料成員, 但實際上
會透過成員函式來取得以及設定屬性值。透過這樣的機制, 您
就可以將類別的使用介面 (資料成員) 與實作細節 (一個成員
函式) 分開來, 降低類別的使用者與類別之間相依的程度, 提
升設計以及維護上的彈性。
在.NET執行環境中, 屬性是透過命名慣例以及額外的中繼資料
來將成員函式與屬性名稱相連結, 這使得屬性在某些語言中可
以以屬性的面貌出現, 但是在其他種類的語言中以成員函式的
面貌出現。
屬性在.NET基礎類別函式庫中出現的相當頻繁, 事實上, 整個
函式庫中大部分提供的都是屬性, 只有極少數是公開的資料成
員。
存取器 (Accessor)
一個屬性包含有屬性的宣告以及一或兩個程式區塊, 稱為存取
器(在某些語言中, 用來設定屬性值的存取器也稱為是變更器
(mutator)), 專門負責取得或是設定屬性值, 以下就是一個範
例:
class Test
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
在這個類別中, 宣告了一個名為 Name 的屬性, 並且定義了該屬
性的讀取器 (Getter) 以及設定器 (Setter), 讀取器中只是很
簡單的傳回一個私有資料成員的值, 而設定器則透過一個名為
value 的特殊變數來設定內部變數的值。當程式叫用設定器時,
變數 value 會包含所要設定給屬性的值, 而 value 的型別就和
屬性本身的型別一樣。
-- 待續
|