发信人: 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的编写者才是高手,只不过他们在语言表达上,也就理所当然地显得比我高深,理解他们的文章就有了一些难度。
(未完待续)
---- ......
不想想起偏更记起
假装开心心更悲
辗转翻侧因为你起
愿你不是你
......
可捒选不恋上你么
可捒选不想你么
种种捒选可以许多
若我不是我
...... |
|