VBA控件教程:类模块和标准模块的比较

2015-06-05 22:58 阅读 106 次 评论关闭

类模块标准模块的不同点在于存储数据方法的不同。标准模块的数据只有一个备份。这意味着标准模块中一个公共变量的值改变以后,在后面的程序中再读取该变量时,它将得到同一个值。

而类模块的数据,是相对于类实例(也就是,由类创建的每一对象)而独立存在的。

同样的,标准模块中的数据在程序作用域内存在,也就是说,它存在于程序的存活期中;而类实例中的数据只存在于对象的存活期,它随对象的创建而创建,随对象的撤消而消失。

最后,当变量在标准模块中声明为 Public 时,则它在工程中任何地方都是可见的;而类模块中的 Public 变量,只有当对象变量含有对某一类实例的引用时才能访问。

上面的比较,同样适用于标准模块和类模块中的公共过程。用下面的例子可以说明。打开一个新 Standard Exe 工程,并在“工程”菜单中个添加一个标准模块和一个类模块,然后运行以下的代码:

把下面的代码放在 Class1 中;

'下面是 Class1 对象的一个属性。
Public Comment As String

'下面是 Class1 对象的一个方法。
Public Sub ShowComment()
   MsgBox Comment, , gstrVisibleEverywhere
End Sub

把下面的代码放在 Module1 中:

'标准模块中的代码是全局的。
Public gstrVisibleEverywhere As String

Public Sub CallableAnywhere(ByVal c1 As Class1)
   '下行改变一个全局变量,这是一个 Class1 实例的(属性)。
      '只有传递给该过程的个别对象才受到影响。
      c1.Comment = "Touched by a global function."
End Sub

把两个命令按钮放在 Form1 上,并在 Form1 中添加以下的代码:

Private mc1First As Class1
Private mc1Second As Class1

Private Sub Form_Load()
   '创建两个 Class1 类的实例。
   Set mc1First = New Class1
   Set mc1Second = New Class1
   gstrVisibleEverywhere = "Global string data"
End Sub

Private Sub Command1_Click()
   Call CallableAnywhere(mc1First)
   mc1First.ShowComment
End Sub

Private Sub Command2_Click()
   mc1Second.ShowComment
End Sub

 F5 键,运行该工程。当 Form1 加载时,它创建两个 Class1 类实例,每个实例有自己的数据。同时,Form1 设置了下面全局变量 gstrVisibleEverywhere 的值。

按下 Command1,调用全局过程并传递引用给第一个 Class1 对象。全局过程设置 Comment 属性,然后 Command1 调用 ShowComment 方法显示该对象的数据。

结果信息框演示了全局过程 CallableAnywhere 如何设置对象的 Comment 属性,而且全局字符串在 Class1 内部是可见的。

按下 Command2,调用第二个 Class1 类实例的 ShowComment 方法。

两个对象都访问了全局字符串变量;然而,第二个对象的 Comment 属性是空的,因为对全局过程 CallableAnywhere 的调用只改变第一个对象的 Comment 属性。

重点 要避免类的代码依赖于全局变量,也就是标准模块中的公共变量。一个类的许多实例可以同时存在,所有这些对象在程序中共享全局数据。

在类模块代码中使用全局变量也违背了面向对象封装的编程原则,因为由这样的类所创建的对象并没有包含它们的所有数据。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:VBA控件教程:类模块和标准模块的比较 | 猎微网

评论已关闭!