发信人: pack27()
整理人: gzwsh(2001-05-12 22:56:12), 站内信件
|
第七天 回味一下类的属性过程
作者:黄河[4326340]
过了有十来天了吧,因为事情比较多,所以今天才又开始我们的类的讨论。先让我们回过头来看看前几次的内容中的一些问题吧。
一、属性过程的问题。
您也许已经注意到了,在我前几次例举的类中,对类的属性使用了属性过程Property Let和Property Get,如果您会使用Public变量,一定会说:在类模块中使用一个Public变量来替代Property Let和Property Get过程不是一样的吗?比如,上次的例子中的:
Public Property Let UserName(ByVal vData As String)
mvarUserName = vData
End Property
Public Property Get UserName() As String
UserName = mvarUserName
End Property
可以用:
Public UserName As String
来替代,在调用类的实例时,同样可以用
MyUser.UserName = Text2 或者 Text2=MyUser.UserName 这样的语句。
您这样想是对的,对于这个UserName属性,因为它是可读可写的属性,而且对它没有别的操作,所以用一个Public变量完全可以替代它。但是我们想一想,如果这个属性是一个只读属性,或者只写属性,会怎样呢?
因为一个Public变量是可写可读的,所以用它不能解决这个问题。而用Property Let和Property Get过程,却可以解决:
只读属性(删掉Property Get语句)只用:
Public Property Let UserName(ByVal vData As String)
mvarUserName = vData
End Property
只写属性(删掉Property Let语句)只用:
Public Property Let UserName(ByVal vData As String)
mvarUserName = vData
End Property
我们再考虑一种情况:如果我们的类要检查用户输入的内容是否合法:比如UserName不能为空,用Public变量就不可能解决或者说不太好解决。用Property Let和Property Get过程却可以:
Public Property Let UserName(ByVal vData As String)
If vData=”” Then
Msgbox “用户名为空!”
Else
mvarUserName = vData
End If
End Property
还有一种情况是只能写一次的属性。
所以,什么时候用Public变量,什么时候用属性过程,是根据您的实际情况来定的,对无限制的属性,可用Public变量,对有限制的属性用属性过程。
您可能听说过Property Set过程,而在前几次的例子中我们没有用到它。它是访问对象类型或Variant类型的属性时用的:下面的例子是MSDN中的例子,在这里借用一下。
Private mvntAnything As Variant
Public Property Get Anything() As Variant
'Set 语句只用于包含了对象引用的任何属性。
If IsObject(mvntAnything) Then
Set Anything = mvntAnything
Else
Anything = mvntAnything
End If
End Property
Public Property Let Anything(ByVal NewValue As Variant)
'(省略验证代码。)
mvntAnything = NewWidget
End Property
Public Property Set Anything(ByVal NewValue As Variant)
'(省略验证代码。)
Set mvntAnything = NewWidget
End Property
如果您学过C++,那我说上面的代码中的Property Set 和Property Let相当于函数的重载,您一定不会奇怪,所谓函数的重载,按我的理解就是:两个函数过程的名称相同,但这个函数要处理的数据类型不同,在调用这个函数的名称时,系统知道该访问哪一个函数过程。这个Property Set 和Property Let就是这样的,同样是Anything这一句称,同样是对类的属性设定值,但当传入的数据是对象类型时,系统会调用Property Set过程,当传入的数据不是一个对象,而是一个Long或String等类型时,系统会调用Property Let语句。这时,Property Get也有一点不同,多了一个IsObject判断。当您使用VB6的类生成器生成类的属性时,这三种属性过程是由VB6给您生成的,但当您是手工建立类代码时,一定要注意您的属性的数据类型。
二、Public WithEvents MyUser As cUsers 中的一点问题
这里的MyUser,我们称之为WithEvents 变量,我们要注意VB对 WithEvents 变量的一些限制:
WithEvents 变量不能是派生对象变量。也就是说,不能把它声明为 As Object ,比如:Public WithEvents MyUser As Object ,当声明该变量时必须指定类名。
不能把 WithEvents 变量声明为 As New。比如:Public WithEvents MyUser As New cUsers ,必须明确地用Set MyUser=New cUser创建事件源对象,并将它赋给 WithEvents 变量。
不能在标准模块中声明 WithEvents 变量。只能在类模块、窗体模块以及其它定义类的模块中声明。
不能创建 WithEvents 变量数组。
在看这些内容时,请对照MSDN。要注意:中文MSDN在翻译时,有一些错误和漏掉的东西,这些错误虽然不是关键的,但对我们理解它带来一些问题,如果您的英文水平不太好,可以找一套三张碟的英文MSDN对照一下——这样也可以使您在学VB时复习一下英文——我现在就是这样干的。
下次,我们一起讨论集合类。
(未完待续)
---- ......
不想想起偏更记起
假装开心心更悲
辗转翻侧因为你起
愿你不是你
......
可捒选不恋上你么
可捒选不想你么
种种捒选可以许多
若我不是我
...... |
|