將屬性加入類別
更新:2007 年 11 月
在本課程中,您將學習如何加入屬性至上一個課程中建立的類別。
在先前的課程詳述:了解屬性、方法和事件中,您了解到所有物件都有屬性 (Attribute),而屬性 (Property) 就代表這些屬性 (Attribute)。在上一個課程中,您建立了代表一個人的 Persons 類別。人也有屬性 (Attribute),例如姓名和年齡,因此 Persons 類別也需要屬性 (Property) 來表示這些屬性 (Attribute)。
屬性有兩種方式可以加入至類別:做為「欄位」加入,或做為「屬性程序」加入。您也可以使用屬性的 Public、ReadOnly 或 WriteOnly 修飾詞,決定屬性的運作方式。
欄位和屬性程序
欄位其實就是類別中的公用變數,這些變數可加以設定或從類別外部讀取。它們對不需要驗證的屬性很有用,例如 Boolean (True 或 False) 值。以 Persons 類別為例,您可能會有名為 Married 的 Boolean 屬性,指定一個人的婚姻狀況是單身還是已婚。由於只有兩種可能的值,因此欄位適用於這種屬性。
若要加入欄位至類別,程式碼看來會如下所示。
Public Married As Boolean
但是大部分的屬性都比這個更複雜,因此在大部分情形下,您可能要用屬性程序,加入屬性至類別中。屬性程序有三部分:宣告私用變數以儲存屬性值、公開值的 Get 程序,以及就跟字面意思一樣,設定值的 Set 程序。
例如,Persons 類別之 Name 屬性的屬性程序看來如下所示。
Private nameValue As String
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
程式碼的第一行會宣告私用 String 變數 nameValue,以便儲存屬性的值。屬性程序本身是以 Public Property 開始,而以 End Property 結束。
Get 程序包含程式碼,會在您要讀取其值的時候執行。例如,當您讀取 Persons.Name 屬性時,程式碼便會傳回儲存在 nameValue 變數中的值。
Set 程序包含程式碼,可利用當做 value 引數傳送給它的值,指派新值給 nameValue 變數。例如,如果撰寫程式碼 Persons.Name = "John",String 值 John 就會做為 value 引數傳送,然後 Set 程序中的程式碼就會將它指派給 NameValue 變數,以供儲存。
您可能會問,為什麼要這麼麻煩?為什麼不使用欄位來表示 Name 屬性?在真實情況下,姓名有特定的規則。例如,姓名當中通常不會包含數字。您可以加入程式碼至 Set 程序中,檢查 value 引數,如果其中包含數字,就會傳回錯誤。
在下列程序中,您將加入一個欄位和三個屬性至 Persons 類別。
試試看!
若要加入屬性至類別
開啟您在上一個課程中所建立的 Persons 專案。如果您並未儲存該專案,就必須先回到上一個課程:模型化真實物件:建立第一個類別,並完成該課程中的程序。
在 [方案總管] 中,選取 [Persons.vb],然後在 [檢視] 功能表中選擇 [程式碼]。
在 Public Class Persons 一行下面加入下列宣告程式碼。
Private firstNameValue As String Private middleNameValue As String Private lastNameValue As String Public Married As Boolean
在宣告程式碼下面加入下列屬性程序。
Public Property FirstName() As String Get FirstName = firstNameValue End Get Set(ByVal value As String) firstNameValue = value End Set End Property Public Property MiddleName() As String Get MiddleName = middleNameValue End Get Set(ByVal value As String) middleNameValue = value End Set End Property Public Property LastName() As String Get LastName = lastNameValue End Get Set(ByVal value As String) lastNameValue = value End Set End Property
在 [檔案] 功能表上,選擇 [全部儲存],儲存您的工作。
唯讀和唯寫屬性
有時屬性本來是只能設定一次的,而在程式執行時永遠不變更。例如,代表員工編號的屬性永遠都不能變更,讓它能夠由另一個程式讀取,但是您不會允許該程式變更它的值。
ReadOnly 關鍵字是用來指定屬性值,只能讀取,不能修改。如果您嘗試指派值給 ReadOnly 屬性,[程式碼編輯器] 中就會發生錯誤。
若要建立唯讀屬性,就要用 Get 程序建立屬性程序,但是不用 Set 程序,如下所示。
Private IDValue As Integer
ReadOnly Property ID() As Integer
Get
ID = IDValue
End Get
End Property
同樣地,WriteOnly 關鍵字允許設定屬性值,但不允許讀取。例如,您不會允許另一個程式讀取密碼屬性。您可以使用該值在您的類別之內執行作業,但要保持為私用。
若要建立唯寫屬性,就要用 Set 程序建立屬性,但是不用 Get 程序,如下所示。
Private passwordValue As String
WriteOnly Property Password() As String
Set(ByVal value As String)
passwordValue = value
End Set
End Property
如果您要接受某個屬性值,然後轉換成不同的值,ReadOnly 和 WriteOnly 屬性程序也很有用。例如,以一個人的年齡為例。跟姓名不一樣,年齡會隨著時間改變,因此如果指派年齡給類別,然後在一年以後讀取,就會發生錯誤。
在 Persons 類別中,您可以加入以下兩個屬性以防止這種情形發生:WriteOnlyBirthYear 屬性 (代表出生年份,永遠不會變更) 以及 ReadOnlyAge 屬性 (傳回計算目前年份與出生年份之間差別的值)。
試試看!
若要加入 ReadOnly 和 WriteOnly 屬性至類別中
在類別模組頂端其他宣告的下面加入下列宣告程式碼。
Private birthYearValue As Integer
在宣告程式碼下面加入下列屬性程序。
WriteOnly Property BirthYear() As Integer Set(ByVal value As Integer) birthYearValue = value End Set End Property ReadOnly Property Age() As String Get Age = My.Computer.Clock.LocalTime.Year - birthYearValue End Get End Property
在 [檔案] 功能表上,選擇 [全部儲存],儲存您的工作。
後續步驟
在本課程中,您學習到有關屬性的資訊,以及可將屬性至類別中的不同方式。在下一個課程中,您將學習如何加入方法至類別中,讓它能夠執行動作。
下一個課程:將方法加入類別