打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
类,对象和实例的浅显理解 - 『Excel在线学习与辅导』 - Excel精英培训网 - ...
userphoto

2011.05.08

关注
实例和对象是一种东西,叫法不同而已
类可以理解为一种类型,比如你定义了一种类型叫“中国人”
对象可以理解为类中的具体的实例,“你”就是“中国人”中实实在在的一个对象
也就是说给类中的各个属性赋予了某一个特定的值,比如:姓名,年龄,身份证号,这样一个抽象的“中国人”就实例化成一个具体的实实在在存在的“人”了
形象的:类:人 对象:我,他,你 类是对象抽象即具体事物的抽象; 对象是类具体事物;
就算天下只剩下一只老虎;那么老虎这个词也是类;  那剩下的一只老虎是一个对象
关于这个问题,我这两天被搅成了浆糊,好在在吕布、兰版等各位老师和童鞋的帮助下,算是搅和的清楚了一些,但限于
对象就是类的实例,这个概念很重要
知识水平有限,还是理解的不深入,就把我目前的理解与大家分享,其中有错误的和不足的地方,请各位老师和童鞋指点
和补充。
很多书上都告诉我们什么是对象,诸如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.excelpx.com/thread-169589-1-1.html
小结一下:这个例子告诉我们什么,是告诉我们,如果有类,没有现成的对象怎么办啊?用关键字new,创建一个就行。
补充一下:定义对象变量语句和赋值语句可以和二为一
Dim myClass As Class1
Set myClass = New Class1
可以变成
Dim myClass As New Class1
帮助里面的描述是这样的:
如果使用 New 来声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用 Set 语句来给该对象引用赋值。
这句我就不解释啦,描述的很清楚。
既然定义对象变量和赋值语句的可以和二为一,那么两条语句和一条语句的区别是什么呢?请详见下面这个帖子:
http://www.excelpx.com/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。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WithEvents
VBA--类模块学习
Java编程思想
Python面向对象编程实战让你轻松掌握
学习Objective-C:入门手册 - iPhone OS开发专区 - CCO
使用Javascript,可以实现多层继承
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服