VB中类的使用
第一天:类的概念
当您第一次看到“类”这个概念时,可能会觉得摸不着头脑。我们先看一点我们熟悉的东西:
在VB控件工具箱中的CommandButton,这是VB中的按钮控件,是我们在VB程序中经常用到的基本控件。我们在学习VB的类之前,单纯地就把它看成一个控件,其实,用类的观点,它就是一个类。我们知道,所有CommandButton都有相同的属性选项,尽管对于画到窗体上去的每个按钮,这些属性的值可能不同;它们也都有相同的事件,尽管我们对画到窗体上的每个按钮的这些事件地处理可能不同;它们也都有不同的方法,尽管我们调用每个画到窗体上的按钮的方法的目的不同。但,所有的窗体中的按钮都是CommandButton这一类控件。
我们新建一个窗体,从控件工具箱中选中CommandButton并画到窗体上,这时,窗体上就有了一个我们非常熟悉的Command1这个按钮。我们看看Command1这个东西,按照类的观点,它现在不能再叫做一个CommandButton控件(类)了,而叫做一个按钮,是CommandButton这个控件(类)的实例。所谓实例就是被具体化的类的一个形态,它有自己的属性,如高度和宽度,有自己的位置和大小,有自己的Caption和Name;它有自己的方法,
vb所有代码
如Move,当我们用Command1.Move这个方法时,谁都知道,只会移动Command1;它有自己的事件,如Click事件,当我们对Command1_Click进行代码编写后,只有Command1会调用我们对这个事件编写的代码。每当我们在这个窗体上新画一个CommandButton,就新产生一个CommandButton的实例,每个新产生的按钮,都有自己的个性,但它们不会有CommandButton这个类所包含的属性项目以外的选择,比如Command1绝对不会有Max属性。
我们再看第二个例子,这个例子我想跳出VB的范围,回到生活中来。比如我们常说,程序员是一类人,在这里,我们把程序员这类人就叫做一个类。这个类有一些属性,比如Name(姓名)、EmpolderTool(使用的开发工具);这个类有一些方法,比如Empolder(开发)、Study(学习);也同样有一些事件,比如EmpolderSucceed(开发成功)、EmpolderLost(开发失败)。
我们现在来创建一个程序员类的实例,好让他可以做点事情。(要记住,没有实例化的类,只是一种概念上的东西,这种东西是什么也不能做的,就象日常生活中我们所见到的一样:程序员可以开发软件,但软件是由明确的属于这个类的一个实例开发出来的,比如求伯君写的WPS,求伯君是程序员这个类的一个实例,而不是这个类本身)。下面的代码是标准的V
B代码,但却是还没有实际意义的代码——因为您不要指望这段VB代码中的程序员类能为您写出一个VB程序来。
[vb]Option Explicit
‘定义一个对象变量,并指定这个变量属于这个类
‘WithEvents使这个对象能响映事件
Dim WithEvents MyDeveloper As cDeveloper
Private Sub Form_Load()
Set MyDeveloper = New cDeveloper ‘这句一定要,这是初始化这个对象
With MyDeveloper
.Name = "求伯君" ‘这个程序员叫做求伯君
.EmpolderTool = "C++" ‘这个程序员用C++进行开发
.Empolder ‘调用Empolder方法使这个程序员进行开发工作
End With
End Sub
‘如果开发失败,则产生EmpolderLost这个事件
Private Sub MyDeveloper_EmpolderLost()
With MyDeveloper
.Study ‘如果开发失败,就让这个程序员进行学习
.Empolder ‘学习后再次进行开发
End With
End Sub
‘如果开发成功,则这个程序员成为一个优秀的程序员
Private Sub MyDeveloper_EmpolderSucceed()
MsgBox "开发成功了!" & MyDeveloper.Name & _
"成为了一个优秀的程序员", vbInformation, "恭喜"
End Sub
[/vb]
我不知道该不该拿求伯君他老人家来举例,但我想,他老人家开发WPS时一定没有我写这段代码这样简单。如果这段代码您有什么不明白,没有关系,我在以后的例子中会进一步说明的,或者您也可以查查MSDN,当类,不要去查Study、.Empolder、EmpolderTool、cDevel
oper这些东西,因为cDeveloper这个类和它的属性、方法和事件本来就是我想出来的,在MSDN中根本不到对这些内容的支持。您最多能到WithEvents这些肉容的帮助。
好了,我举了两个例子,您对类的概念应该有些认识了吧。它就是一类对象的抽象后的集合——我不知道这个定义是否是标准的,但我是这样理解的,好在这种理解并没对我在实际编写含有类模块的程序时遇到过什么麻烦。
第二天:建立一个简单的类
在《第一天:类的概念》中我们讲了类的概念。今天我们就再来看看如何创建上次用过的那个cDeveloper类是怎样创建的。
首先:我们新建一个工程,然后在“工程浏览器”中按鼠标右键,在弹出菜单中选择“添加”,在添加菜单项的下级菜单中选择“添加类模块”。在弹出的“添加类模块”对话框中双击“VB 类生成器”。
接着,我们会看见类生成器对话框。现在我们点击工具栏上的第一个按钮,也就是添加新类的按钮。这时,会出现类模块生成器对话框。在这个对话框的属性选项卡上的“名称”(Name)文本框中输入cDeveloper——在这个文本框下面还有一个“基于”(Based On)
文本框,这里我们先不去管它,以会我会讲到它的。在这个对话框的“特性”选项卡中,有一个“描述”文本框,我们可以在里面输入对这个类的说明,比如:“这是一个程序员类”。然后我们按确定按钮退出“类模块生成器”对话框。
再接着我们看看原来的“类生成器”对话框中左边的树型浏览器中在原来的工程下面多了一个“cDeveloper”项。选中这个项,点击对话框工具栏上的第三个按钮(添加属性),这时会弹出“属性生成器”对话框。
在这个对话框中的“属性”选项卡中的“名称”文本框中,我们输入:DeveloperName(这里有一点要注意,在“第一天”的例子中,我用的是Name属性,为什么在这里要用DeveloperName呢?因为Name是VB的保留字,如果您在这里输入了Name,VB会提示您出错的)。然后在“名称”文本框下面的“数据类型”下拉列表中选择”String”项(注意,一定要选择,如果您是输入的,因为大小写的原因,最后生成的代码可能会有问题)。下面的“声明”栏中的选项先不要管它,以后再说。
在这个对话框中的“特性”选项卡中的“描述”文本框中,您可以输入对这个属性的说明,比如:“这是程序员的姓名”。
然后按确定按钮关闭这个“属性生成器”对话框。
进行了上面的操作后,我们会发现,在“类生成器”对话框右边的属性选项卡中多了一项我们才添加的这个DeveloperName属性(您的“类生成器”对话框右边的选项卡可能没有选中“属性”这一页)。
重复上面添加属性的操作,添加一个EmpolderTool属性,数据类型还是为String。
到这时为止,我们的cDeveloper类就有了两个属性了。下面我们要为它添加两个方法.Study和Empolder。
要添加这两个方法,我们要点击“类生成器”对话框上的每四个按钮(添加新方法)。点击后会出现“方法生成器”对话框。
在这个对话框中的“属性”选项卡中的名称文本框中,我们输入“Study”(这个文本框下面的内容(包括参数)我们先不去管它)。然后点确定关闭这个“方法生成器”对话框。
重复上面添加方法的操作,添加一个Empolder方法。
最后,我们就剩添加两个事件了。让我们点击“类生成器”工具栏上的第五个按钮(添加新事件),我们就会看到“事件生成器”对话框。我们在这个对话框中的名称文本框中输入“EmpolderSucceed”,下面的参数现在不用管它,以后介绍。
重复添加新事件的操作,在我们的类中添加“EmpolderLost”事件。
现在我们的工作完成了,只要选择类生成器的“文件”菜单中的更新工程,这个cDeveloper类和它的属性、方法和事件就被添加到我们的工程中了,我们可以从“工程”浏览框中看到这个新加入的cDeveloper类模块。双击这个类模块,我们可以看见VB为这个类模块添加了下面这些代码:
[vb]Option Explicit
‘local variable(s) to hold property value(s)
Private mvarDeveloperName As String ‘local copy
Private mvarEmpolderTool As String ‘local copy
‘To fire this event, use RaiseEvent with the following syntax:
‘RaiseEvent EmpolderLost[(arg1, arg2, ... , argn)]
Public Event EmpolderLost()
‘To fire this event, use RaiseEvent with the following syntax:
‘RaiseEvent EmpolderSucceed[(arg1, arg2, ... , argn)]
Public Event EmpolderSucceed()
Public Sub Empolder()
End Sub
Public Sub Study()
End Sub
Public Property Let EmpolderTool(ByVal vData As String)
‘used when assigning a value to the property, on the left side of an assignment.
‘Syntax: X.EmpolderTool = 5
mvarEmpolderTool = vData
End Property
Public Property Get EmpolderTool() As String
‘used when retrieving value of a property, on the right side of an assignment.
‘Syntax: Debug.Print X.EmpolderTool
EmpolderTool = mvarEmpolderTool
End Property
Public Property Let DeveloperName(ByVal vData As String)
‘used when assigning a value to the property, on the left side of an assignment.
‘Syntax: X.DeveloperName = 5
mvarDeveloperName = vData
End Property
Public Property Get DeveloperName() As String
‘used when retrieving value of a property, on the right side of an assignment.
‘Syntax: Debug.Print X.DeveloperName
DeveloperName = mvarDeveloperName
End Property
[/vb]
我使用的是英文版的VB6,所以如果您使用的是中文版的VB6,见到的代码中的注释部份和我的不同,您的是中文的注释。第一句:Option Explicit。你也可能没有,但最好请您加上,这是强制声明的选项,有了这一句之后,您的所有的变量都必须显示地声明后才能使用,这能一定程度上保证您的代码的正确性。
您如果觉得跟着我用类生成器生成这个类太繁锁,没关系,您只要象添加窗体一样新添加一个类,并双击打开它,然后把上面的这段代码Copy到它里面也可以,反正以后我会对这些生成的代码进行说明的,当您熟悉这些代码的涵义后,用代码而不用类生成器有时反而更简单。
对于这个生成的类,现在还只能对他的属性赋值,他还什么也不能做,这并不奇怪,因为我们还要添加代码告诉他该怎么做,该怎么响应事件。
下次,在学习如何添加代码来完善我们的cDeveloper的功能前,先要解决掉一些细节问题。
第三天、解决一些细节问题