共用方式為


將屬性加入類別

更新: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 類別。

試試看!

若要加入屬性至類別

  1. 開啟您在上一個課程中所建立的 Persons 專案。如果您並未儲存該專案,就必須先回到上一個課程:模型化真實物件:建立第一個類別,並完成該課程中的程序。

  2. 在 [方案總管] 中,選取 [Persons.vb],然後在 [檢視] 功能表中選擇 [程式碼]。

  3. 在 Public Class Persons 一行下面加入下列宣告程式碼。

    Private firstNameValue As String
    Private middleNameValue As String
    Private lastNameValue As String
    Public Married As Boolean
    
  4. 在宣告程式碼下面加入下列屬性程序。

    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
    
  5. 在 [檔案] 功能表上,選擇 [全部儲存],儲存您的工作。

唯讀和唯寫屬性

有時屬性本來是只能設定一次的,而在程式執行時永遠不變更。例如,代表員工編號的屬性永遠都不能變更,讓它能夠由另一個程式讀取,但是您不會允許該程式變更它的值。

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 屬性至類別中

  1. 在類別模組頂端其他宣告的下面加入下列宣告程式碼。

    Private birthYearValue As Integer
    
  2. 在宣告程式碼下面加入下列屬性程序。

    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
    
  3. 在 [檔案] 功能表上,選擇 [全部儲存],儲存您的工作。

後續步驟

在本課程中,您學習到有關屬性的資訊,以及可將屬性至類別中的不同方式。在下一個課程中,您將學習如何加入方法至類別中,讓它能夠執行動作。

下一個課程:將方法加入類別

請參閱

工作

模型化真實物件:建立第一個類別

概念

屬性程序和欄位

其他資源

使用物件設計程式:使用類別