精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..技术文章连载..〓〓>>跟我学用VB的类(系列)>>(转)跟我学用VB的类(系列)之第七天

主题:(转)跟我学用VB的类(系列)之第七天
发信人: 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时复习一下英文——我现在就是这样干的。 
下次,我们一起讨论集合类。 

(未完待续) 



----
......
不想想起偏更记起
假装开心心更悲
辗转翻侧因为你起
愿你不是你
......
可捒选不恋上你么
可捒选不想你么
种种捒选可以许多
若我不是我
...... 

[关闭][返回]