用户定义类型是一个使相关数据项成组的强大工具。例如,假设此处要定义名为 udtAccount
的用户定义类型:
Public Type udtAccount
Number As Long
Type As Byte
CustomerName As String
Balance As Double
End Type
可以声明一个 udtAccount
类型的变量,分别给各个字段赋值,然后将整个记录传递给打印它的过程,并将其保存至数据库中,对其执行计算,验证各字段的数值,等等。
用户定义类型尽管功能强大,但也给编程者带来了一些问题。例如所创建的提款过程可能出错,如果当提款超过帐上余额,程序中又没有措施防止其它代码对余额字段减时就会出错。
换句话说,过程和用户定义类型的结合效果取决于规则、内存和维护代码的编程者的知识水平。
面向对象的编程通过将数据和过程结合成一个单一实体解决了上述问题,如图 9.5 所示。
图 9.5 对象使数据和过程相结合
当用户定义类型 udtAccount
变成 Account 类时,其数据变成了私有型,访问它们的过程移动类中并变成了属性和方法。这就是所谓的封装的意思- 这就是说,对象是一个包括了代码和数据的单元(如果愿意,也可称其为密封舱
)。
当从 Account 类创建一个 Account 变量时,访问其数据的唯一途径就是通过构成其界面的属性及方法。以下的代码段说明在 Account 类中的过程是如何支持封装的:
'
帐户余额对外界代码是隐藏的。Private mdblBalance As Double
'
帐户余额的只读属性允许外部的代码'
获取帐户余额。Public Property Get Balance() As Double
Balance = mdblBalance
End Property
'
提取存款的方法改变了帐户的余额,'
但仅限于不发生透支错误的情况。Public Sub Withdrawal(ByVal Amount As Double)
If Amount > Balance Then
Err.Raise Number:=vbObjectError + 2081, _
Description:="Overdraft"
End If
mdblBalance = mdblBalance - Amount
End Sub
现在,暂不要考虑如何将过程放进类中,也不要考虑如何理解属性过程和私有变量的语法。要记住的重点就是可以定义一个对象来封装数据和确保数据的可靠。
有了 Account 对象,就永远不必关心是否调用了正确的过程更新帐户,因为可以调用的那些过程都已经组装进对象中了。
详细信息 “定制窗体类”部分将属性和方法的创建放入已熟悉的框架。然后,“给类添加属性和方法”部分将解释其语法。
可以参阅“再论编程”中的“创建自己的数据类型”中关于用户定义类型的内容。
关于子过程和函数过程的详细信息,请参阅第五章“编程基础”中的“过程概述“。