类属性定义最简单的方法,是向类的模块添加公共变量。例如,只要在名为 Account 的类中声明两个公共变量,可非常简单的创建 Account 类:
Public Balance As Double
Public Name As String
给类创建私有数据也很简单,只须声明一个 Private 变量,它就能被该类模块中的编码所访问:
Private mstrMothersMaidenName As String
Private mintWithdrawalsMonthToDate As Integer
数据隐藏是指保护对象的部分数据,而其余数据则以属性形式公开。这是面向对象的封装原则的一个方面,已在“类:将用户定义类型和过程组织在一起”中进行了解释。
数据隐藏意味着可以改变类而不影响已存在的编码。例如,将 Account 类的私有变量 mintWithdrawalsMonthToDate 的类型从 Integer 改变为 Long,而不改变调用 Account 对象已存在的编码。
数据隐藏也允许定义只读属性。例如,可用 Property Get 属性过程返回包含了一个月的取款次数的私有变量,该变量只能在 Account 对象编码中递增。这就产生了属性过程。
如果只能通过声明公共变量来创建属性,那么数据隐藏就没有多大用处。如果引用 Account 对象的任何代码将帐号类型设置为任意值,那么给 Account 类添加 Type 属性究竟有多大的好处呢?
当设置或检索属性值时,就可执行属性过程的代码。例如,可用一对属性过程来实现 Account 对象的 Type 属性:
Public Enum AccountTypes atSavings = 1 atChecking atLineOfCredit End Enum '储存Type属性的私有数据。Private mbytTypeAs AccountTypesPublic Property Get Type() As AccountTypesType = mbytTypeEnd PropertyPublic Property Let Type(ByVal NewType As AccountTypes)Select Case NewTypeCase atChecking, atSavings, atLineOfCredit'若NewType有效,则无须做任何事。Case ElseErr.Raise Number:=vbObjectError + 32112, _Description:="Invalid account type"End SelectIf mbytType > NewType ThenErr.Raise Number:=vbObjectError + 32113, _Description:="Cannot downgrade account type"ElsembytType = NewTypeEnd IfEnd Property
假设有一个名为 acct 的变量,引用 Account 对象。当执行 x = acct.Type编码时,调用 Property Get 过程,返回存于类模块私有成员 mbytType 的值。
当执行 acct.Type = atChecking 代码时,将调用 Property Let。若对象是完全新的,则 mbytType 为零,并赋给任何有效的帐号类型。如果现在的帐号类型是 atSavings,则该帐号将会升级。
但是,如果当前的帐号类型是 atLineOfCredit,则 Property Let 为防止降级将给出错误信息。同样地,执行 acct.Type = 0 代码,Property Let 的 Select 语句将检测到非法的帐号类型值,并指出错误。
总之,属性过程可允许对象保护并验证自己的数据。
详细信息 任何情况下使用公共变量都好吗?“属性过程与公共变量比较”描述了二者正确使用的要点。
在“运用属性过程”中进一步给出了属性过程的功能。