精华区 [关闭][返回]

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

主题:(转)跟我学用VB的类(系列)之第八天
发信人: pack27()
整理人: gzwsh(2001-05-12 22:56:12), 站内信件
第八天 为创建集合类做些准备 
    
什么是集合?比如我们在前面创建的cUsers类,当我们用 
Public WithEvents MyUser As cUsers 
Set MyUser=New cUser 
就创建了这个类的一个实例——这个实例就是一个对象。但是我们的User往往不只一个,可能有叫黄河的用户,可能有叫快乐老猫的用户,于是我们就可以用这样的方法创建多个User 
Public WithEvents MyUser1 As cUsers 
Public WithEvents MyUser2 As cUsers 
………… 
Set MyUser1=New cUser 
Set MyUser2=New cUser 
………… 
我们会发现,这些User有着非常相似的地方——我不是说他们长得相似,而是说它们都有.UserID 、    MyUser.UserName 、MyUser.UserPassword 这些属性,也有相似的方法和事件。但是用MyUser1、MyUser2这样的方式来管理这些User并不方便。 
您也许会想到可以用一个对象数组MyUser()来管理他们,但是在第七天里的“Public WithEvents MyUser As cUsers 中的一点问题”中我们曾谈到:不能创建 WithEvents 变量数组。也就是说,如果用数组来管理这些User,那么,我们就会失去对象事件的处理方法——对于面向对象编程来说,这是一个重大的损失。 
您还会想到的一定就是用Collection(集合)对象来管理这些User了。集合就是把一些对象按一定的方式组织在一起。的我们看看下面的代码:还是使用上面用到过的cUser类,在窗体部份加上下面的代码 
Option Explicit 
Public WithEvents MyUser As cUsers 
Public colUser As Collection 
Private Sub cmdAddNew_Click() 
    Set MyUser = New cUsers '创建一个用户 
    MyUser.UserID = Text1 
    MyUser.UserName = Text2 
    MyUser.UserPassword = Text3 
    colUser.Add MyUser, Text1 
    Set MyUser = Nothing 
End Sub 

Private Sub cmdDelete_Click() 
    colUser.Remove CLng(Text1) 
    Text1 = "" 
    Text2 = "" 
    Text3 = "" 
End Sub 

Private Sub cmdQuery_Click() 
    Set MyUser = New cUsers 
    On Error GoTo Err 
    Set MyUser = colUser(Text1) 
    On Error GoTo 0 
    Text1 = MyUser.UserID 
    Text2 = MyUser.UserName 
    Text3 = MyUser.UserPassword 
    Set MyUser = Nothing 
    Exit Sub 
Err: 
    MsgBox "没有这个用户" 
End Sub 

Private Sub cmdUpdate_Click() 
    Set MyUser = New cUsers 
    On Error GoTo Err 
    Set MyUser = colUser(Text1) 
    On Error GoTo 0 
    MyUser.UserID = Text1 
    MyUser.UserName = Text2 
    MyUser.UserPassword = Text3 
    Set MyUser = Nothing 
    Exit Sub 
Err: 
    MsgBox "无此用户" 
End Sub 

Private Sub Form_Load() 
    Set colUser = New Collection   '在这里创建这个集合的一个实例 
End Sub 

Private Sub Form_Unload(Cancel As Integer) 
    Set MyUser = Nothing 
    Set colUser = Nothing 
End Sub 
在这里,集合colUser在程序运行期间起到了数据库的作用,它保存了所有User对象。您可能会发现,在这里,我没用到cUser类的GetUserInfo、SaveUserInfo、DeleteUserInfo方法,因为这些操作由集合来完成了,如果要保存这些用户的情况,可以在窗体中添加对数据库的操作。 
但是这样做对吗?这样做符合对象封装的要求吗?其实这样做的确是相当不正确的。我们在前面讨论过的类的优点在这里都没发挥出来,在这里,这个类更象是一个用户类型: 
Private Type MyUser 
   UserID As Long 
   UserName As String 
   Password As String 
End Type 
    而且还有一个问题,就是这个集合不能判断存到它里面去的对象是什么,比如前面的colUser.Add MyUser, Text1这一句,我们把它改成colUser.Add Me, Text1,就是把当前窗体存入这个集合。这时,不会报错,但当您用For Each……Next或者用colUser(Index)来访问这个集合时,当正好访问到这个Me时,Me.UserID = Text1一定会出错的。 
那么有什么更好的办法呢?那就是集合类——就是把集合封装到一个类中,用这个集合类来处理它的子类。 
比如,我们的cUsers类,我们把它更名为cUser,用来处理单个的User对象,再建一个集合类,名为cUsers,用来存储所有被创建的User对象的集合。 
    今天就到这里,明天我们就写一个完整的包涵集合类的程序。 
    在看这部份内容时,您可以参考MSDN中的程序员指南中的VB能做什么中的用对象编程部份。从技术水平上讲,MSDN的编写者才是高手,只不过他们在语言表达上,也就理所当然地显得比我高深,理解他们的文章就有了一些难度。 

(未完待续) 



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

[关闭][返回]