实例和对象是一种东西,叫法不同而已
类可以理解为一种类型,比如你定义了一种类型叫“中国人” 对象可以理解为类中的具体的实例,“你”就是“中国人”中实实在在的一个对象 也就是说给类中的各个属性赋予了某一个特定的值,比如:姓名,年龄,身份证号,这样一个抽象的“中国人”就实例化成一个具体的实实在在存在的“人”了 形象的:类:人 对象:我,他,你 类是对象抽象即具体事物的抽象; 对象是类具体事物; 就算天下只剩下一只老虎;那么老虎这个词也是类; 那剩下的一只老虎是一个对象
关于这个问题,我这两天被搅成了浆糊,好在在吕布、兰版等各位老师和童鞋的帮助下,算是搅和的清楚了一些,但限于 对象就是类的实例,这个概念很重要 知识水平有限,还是理解的不深入,就把我目前的理解与大家分享,其中有错误的和不足的地方,请各位老师和童鞋指点
和补充。
很多书上都告诉我们什么是对象,诸如range,worksheet,workbook,对象有属性、方法、事件,这些我就不乱讲啦,也
远远没有书上讲的好。我举几个简单的代码例子,告诉你哪个是对象,哪个是类,哪个是实例。其实我最担心的是我的某
些理解是错误的,如果您发现了,一定帮我纠正过来。
1)以range对象举个例子
- sub test()
- dim myRng as Range
- set myRng=range("a1")
- end sub
复制代码
正如上图所示,range是类,myRng是对象变量,range("a1")是对象,也就是range类的实例(对象就是类的实例,这个概念很重要)。 range是类不是我说的,是微软说的,这是对象浏览器的截图。 dim myRng as Range 这句代码是声明一个对象变量,以Range类为模板,记住,对象变量不是一个对象; set myRng=range("a1") 这句代码中,对象出现了,range("a1"),myRng这个对象变量只是对range("a1")对象的引用,记住,是对象的引用,不是对象。 为什么我们说对象变量myRng只是对range("a1")对象的引用呢? 因为对象变量不储存数据,它们只是告诉数据在哪儿。正如本例所表示的,myRng对象变量告诉VB数据在当前工作表的单元格"a1",并没有把range("a1")这个对象赋值给myRng。
|
|
|
|
|
|
|
|
2)我们用类模块做个例子 假设我们有个类模块 Class1 ,代码如下
- Option Explicit
- Public value1 As Integer
复制代码
在标准模块中输入如下代码:
- Option Explicit
-
- Sub test()
- Dim myClass As Class1
- Set myClass = New Class1
- myClass.value1 = 1
- End Sub
复制代码
和第一个例子一样,先定义对象变量,然后把对象的引用赋值给对象变量; 看到第二个例子,您肯定和我第一看到这条语句一样,产生了疑问,怎么多了个New,起什么作用的? 帮助里是这样描述的: 如果 New 与 Set 一起使用,则将创建该类的一个新实例。 怎么理解这句话呢,我这这样认为的,set语句是为了把对象的引用赋值给对象变量,这里面对象在哪里呢?是Class1吗,不是,那是什么,是新创建的实例(我们已经知道,对象就是类的实例),new Class1,多么形象啊,原来new关键词是创建对象的。
这样我们就看懂了上面的代码 Dim myClass As Class1 定义一个以类Class1为模板的对象变量 Set myClass = New Class1 因为没有现成的Class1类的实例(也就是对象),所以用new关键词立刻创建一个,然后把这个对象的引用复制给对象变量。
这个时候,您可能会思考,第一个代码里面直接用了range("a1")这个现成的对象,能不能也用new关键字呢?下面是错误的代码
- set myRng as new range
复制代码
为什么不能用new关键词呢,原因在vbe的帮助里已经写了:
New 关键字不能用来声明任何内部数据类型的变量以及从属对象的实例
因为range对象是从属对象,所以不能用new关键字,直接拿来用就可以啦。 关于从属对象,兰版解释过,请看这个帖子 http://www./thread-169589-1-1.html
小结一下:这个例子告诉我们什么,是告诉我们,如果有类,没有现成的对象怎么办啊?用关键字new,创建一个就行。
补充一下:定义对象变量语句和赋值语句可以和二为一 Dim myClass As Class1 Set myClass = New Class1 可以变成 Dim myClass As New Class1 帮助里面的描述是这样的: 如果使用 New 来声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用 Set 语句来给该对象引用赋值。 这句我就不解释啦,描述的很清楚。
既然定义对象变量和赋值语句的可以和二为一,那么两条语句和一条语句的区别是什么呢?请详见下面这个帖子:
http://www./forum.php?mod=viewthread&tid=169192&page=2#pid2547131
|
|
|
|
|
|
|
|
|
|
|
3)举一个关于定义字典对象的例子 由于字典对象是外部对象,所以有两种定义方法
方法一:
首先完成引用库的过程: 先引用微软的脚本运行时库Microsoft Scripting Runtime,可在VBE窗口,从菜单-工具-引用,然后勾选Microsoft Scripting Runtime,或者点击浏览,在添加引用对话框中选择c:\windows\system32\scrrun.dll,并打开,确定。完成引用。
然后按照我们上面说的对象变量的定义和引用方法:
1. Sub test()
2. Dim d As Scripting.Dictionary
3. Set d = New Dictionary
4. End Sub
复制代码
这个代码大家肯定非常清楚,d是对象变量,Scripting.Dictionary是类(实际上Scripting是库,Dictionary是类,我们添加了引用库后,就可以不写库名啦,所以也可以写成Dim d As Dictionary),New dictionary是创建对象(Dictionary类的实例)
方法二: 如果我们没有引用库的操作:
那么我们就要这样来写代码
1. Sub test()
2. Dim d as object
3. Set d = CreateObject("Scripting.Dictionary")
4. ENd Sub
复制代码
在上面的代码中,也没有用到new关键字,为什么呢?
是这样的,set语句帮助里有这么一句话:
可以用 New 关键字或 CreateObject 函数,在 Set 语句中赋值对一个新的对象的引用。
实际上,在这个代码中,d还是对象变量,不过这一次类是不可知的,所以就用object代替啦。因为对象不可知,所以不能用new object,这肯定是错误的,于是就用了CreateObject函数,来代替new关键字,创建一个新的dictionary对象,并且将对象引用赋值给对象变量d。
|