分享

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

 hanzinu 2011-05-08

实例和对象是一种东西,叫法不同而已  
类可以理解为一种类型,比如你定义了一种类型叫“中国人”
对象可以理解为类中的具体的实例,“你”就是“中国人”中实实在在的一个对象
也就是说给类中的各个属性赋予了某一个特定的值,比如:姓名,年龄,身份证号,这样一个抽象的“中国人”就实例化成一个具体的实实在在存在的“人”了   
    形象的:类:人 对象:我,他,你 类是对象抽象即具体事物的抽象; 对象是类具体事物;
    就算天下只剩下一只老虎;那么老虎这个词也是类;  那剩下的一只老虎是一个对象
    关于这个问题,我这两天被搅成了浆糊,好在在吕布、兰版等各位老师和童鞋的帮助下,算是搅和的清楚了一些,但限于
对象就是类的实例,这个概念很重要
知识水平有限,还是理解的不深入,就把我目前的理解与大家分享,其中有错误的和不足的地方,请各位老师和童鞋指点

和补充。

很多书上都告诉我们什么是对象,诸如range,worksheet,workbook,对象有属性、方法、事件,这些我就不乱讲啦,也

远远没有书上讲的好。我举几个简单的代码例子,告诉你哪个是对象,哪个是类,哪个是实例。其实我最担心的是我的某

些理解是错误的,如果您发现了,一定帮我纠正过来。


1)以range对象举个例子
  1. sub test()
  2.   dim myRng as Range
  3.   set myRng=range("a1")
  4. end sub

复制代码
  

 
 
正如上图所示,range是类,myRng是对象变量,range("a1")是对象,也就是range类的实例(对象就是类的实例,这个概念很重要)。

range是类不是我说的,是微软说的,这是对象浏览器的截图。

 
图2.jpg


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 ,代码如下

  1. Option Explicit
  2. Public value1 As Integer

复制代码


在标准模块中输入如下代码:

  1. Option Explicit
  2.  
  3. Sub test()
  4.   Dim myClass As Class1
  5.   Set myClass = New Class1
  6.   myClass.value1 = 1
  7. End Sub

复制代码

如图所示
 
 图1.jpg
 
 


和第一个例子一样,先定义对象变量,然后把对象的引用赋值给对象变量;
看到第二个例子,您肯定和我第一看到这条语句一样,产生了疑问,怎么多了个New,起什么作用的?
帮助里是这样描述的:
   如果 New 与 Set 一起使用,则将创建该类的一个新实例。
怎么理解这句话呢,我这这样认为的,set语句是为了把对象的引用赋值给对象变量,这里面对象在哪里呢?是Class1吗,不是,那是什么,是新创建的实例(我们已经知道,对象就是类的实例),new Class1,多么形象啊,原来new关键词是创建对象的。

这样我们就看懂了上面的代码
Dim myClass As Class1 定义一个以类Class1为模板的对象变量
Set myClass = New Class1 因为没有现成的Class1类的实例(也就是对象),所以用new关键词立刻创建一个,然后把这个对象的引用复制给对象变量。

这个时候,您可能会思考,第一个代码里面直接用了range("a1")这个现成的对象,能不能也用new关键字呢?下面是错误的代码

 

  1. 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。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多