向类添加属性

更新:2007 年 11 月

在本课中,您将学习如何向前一课中所创建的类中添加属性。

在前面的课程 详细了解:了解属性、方法和事件 中,您了解了所有对象都有属性,并且属性表示特性。在前一课中,您创建了一个表示人的 Persons 类;人具有诸如姓名或年龄等属性 (Attribute),因此 Persons 类需要表示那些属性 (Attribute) 的属性 (Property)。

向类中添加属性可以采用以下两种方式之一:“字段”或“属性过程”。还可以用属性的 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 过程包含用于为 nameValue 变量赋新值的代码,它将传递给该变量的值用作 value 参数。例如,如果编写代码 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. 在“文件”菜单上,选择“全部保存”以保存所做的工作。

后续步骤

在本课中,您学习了属性和在类中添加属性的不同方法。在下一课中,您将学习如何在类中添加方法,使其可以执行操作。

下一课:向类添加方法

请参见

任务

对实际对象进行建模:创建您的第一个类

概念

属性过程与字段

其他资源

使用对象编程:使用类