1、 向类添加属性
向类中添加属性可以采用以下两种方式之一:“字段”或“属性过程”。还可以用属性的 Public、ReadOnly 或 WriteOnly 修饰符确定属性如何工作。
字段和属性过程
字段其实只是类中的公共变量,可以从该类的外部设置或读取这些变量。它们对于无需验证的属性很有用,例如 Boolean(True 或 False)值。在 Persons 类中,可能有一个名为 Alive 的 Boolean 属性,它指定一个人是死了还是活着。由于只可能有两个值,所以字段最适合此属性。
向类中添加字段的代码如下所示。
Public Alive 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 参数,如其中含有数字则返回错误。
只读和只写属性
有时一个属性只能设置一次,以后在程序中执行时永远不能更改。例如,表示雇员编号的属性永远不能更改,所以它可以由另一个程序读取,但您不能允许该程序更改它的值。
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
在“文件”菜单上,选择“全部保存”以保存所做的工作。