后面会用到的一个例子MYCLASS示例
S722RIV3.rar
(9.86 KB, 下载次数: 2147)
假设同样是上面那个MYCLASS类模块(里面有个PUBLIC X) 对照一个标准模块,它的名字叫MOD1,它也定义了一个PUBLIC INTERGER X 在两个模块中都各写一个相同的HELLO子程序: '—————————— PUBLIC SUB HELLO() MSGBOX X END SUB '—————————— 首先,调用MOD1.HELLO可以直接显示出X的值(默认是0) MYCLASS正如前面所说,它是一份“图纸”,没有实例之前 不可以用MYCLASS.HELLO这种形式调用,因为HELLO根本找不到X这个变量 这行代码会出错: MYCLASS.HELLO '错误! 我们再做如下工作 '—————————————— DIM P AS NEW MYCLASS DIM A AS NEW MYCLASS DIM X AS NEW MYCLASS '请注意!这个X跟MYCLASS里的X不一样! P.X=3 A.X=4 X.X=5 P.HELLO A.HELLO X.HELLO '—————————————— 大家有没有注意到一个问题,上面同样是SUB HELLO一模一样的代码,一个字都没有改,更没有任何参数,这是一个很简单的子程序,但在P,X,A三个实例对象中,为什么运行时却显示出三个不同的结果?
标准模块MOD1的HELLO是朴实无华的HELLO,它取X这个参数也没什么地方可取,X就摆在那里了, 但MYCLASS的X不一样,不同的X,跟着不同的对象,比如P.X,还有A.X,有X.X,在类里的HELLO程序, 怎么分清这些X,让MSGBOX显示不同的X呢?
事实上,在类模块中的子程序(或函数),总是隐藏着传入了一个参数,这个参数是代表对象本身的ME, (在C++中称为this),真正的MYCLASS类子程序HELLO“原形”是这样的 PUBLIC SUB HELLO(ME as MYCLASS) '<==不要这样写,只是做一个说明
在MYCLASS中显示MSGBOX X的时候,实际上是 MSGBOX ME.X 这样一来,象上面那个P.HELLO 在VBA内部运行时,真正的运行原形其实就是A.Hello(P) 传了它本身作为参数 而A.HELLO、X.HELLO也是类似的,相当于A.HELLO(A),X.HELLO(X)
明白了吗?在类模定义的子程序和函数,它们会比标准模块同样的程序/函数定义多传进一个隐藏的参数,这个参数是ME (但有一个例外,你定义为STATIC的静态函数不会带隐藏参数,这个以后再说)
p.s.顺便说说困扰了很多朋友的一个问题,为什么不允许THISWORKBOOK的自定义函数当成公式使用 如前面所述,标准模块的函数/程序是比较简单的,你给了一个参数列表,就照样传进去了,另外,标准模块的数据跟类不一样,不会重复(比如你不能在两个标准模块中定义同样的HELLO子程序)。 工作表使用的公式,要的是统一函数格式,就是标准模块的普通函数传递格式(工作表运算时也没有必要找某个对象的隐藏参数),而类里面定义的函数,总是比想象中多了一个参数ME,不合要求......
[此贴子已经被作者于2006-6-26 10:44:43编辑过] |