标准模块与类模块的比较
在数据存储方式上,类不同于标准模块。标准模块的数据不可能多于一份。这意味着若程序中某个部分改动了标准模块的公共变量,随后程序的其它部分读取该变量会得到该值。
相反,类模块数据则独立存在于每个类的实例中。
应避免使类中的代码依赖于全局数据─ 即标准模块中的公共变量。一个类可能同时存在很多个实例,所有这些对象都共享部件中的全局数据。
静态的类数据
在类模块中使用全局变量不符合面向对象编程的封装概念,因为这种类创建的对象没有包含它所有的数据。不过,有时要让同一个类模块创建的所有对象共享一个数据成员。例如,一个类所创建的所有对象要共享一个属性值,如部件的名称或版本号。
这种对封装的故意违反有时称之为静态的类数据。通过使用 Property 过程设置并返回标准模块中的 Public 数据成员,就可以在 Visual Basic 的类模块中实现静态的类数据,如下面代码段所示:
'返回应用程序名的只读 property。
Property Get ComponentName() As String
'变量 gstrComponentName 存储于标准模块中,声明为 Public。
ComponentName = gstrComponentName
End Property
通过提供一个相关的 Property Let 过程─ 或对包含对象引用的属性使用 Property Set 过程─ 给标准模块中的数据成员赋新值,可以实现非只读的静态的类数据。
重点 在设计使用静态数据的类时,要考虑到所写的部件要为若干个客户端应用程序(如果是进程外部件)或者为一个客户端以及若干个进程内部件(如果是进程内部件)提供对象。即使该类创建的所有对象被不同的客户端使用,但都共享该静态数据。
类模块和标准模块的比较
类模块和标准模块的不同点在于存储数据方法的不同。标准模块的数据只有一个备份。这意味着标准模块中一个公共变量的值改变以后,在后面的程序中再读取该变量时,它将得到同一个值。
而类模块的数据,是相对于类实例(也就是,由类创建的每一对象)而独立存在的。
同样的,标准模块中的数据在程序作用域内存在,也就是说,它存在于程序的存活期中;而类实例中的数据只存在于对象的存活期,它随对象的创建而创建,随对象的撤消而消失。
最后,当变量在标准模块中声明为 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 方法显示该对象的数据。
正如图 9.6 所示,结果信息框演示了全局过程 CallableAnywhere 如何设置对象的 Comment 属性,而且全局字符串在 Class1 内部是可见的。
图 9.6 第一个 Class1 对象的信息框
按下 Command2,调用第二个 Class1 类实例的 ShowComment 方法。
如图 9.7 所示,两个对象都访问了全局字符串变量;然而,第二个对象的 Comment 属性是空的,因为对全局过程 CallableAnywhere 的调用只改变第一个对象的 Comment 属性。
图 9.7 第二个 Class1 对象的信息框
重点 要避免类的代码依赖于全局变量,也就是标准模块中的公共变量。一个类的许多实例可以同时存在,所有这些对象在程序中共享全局数据。
在类模块代码中使用全局变量也违背了面向对象封装的编程原则,因为由这样的类所创建的对象并没有包含它们的所有数据。
静态类数据
有时,希望由一个类模块所创建的一些对象共享某个数据项。这就是所谓的静态类数据。
不能在 Visual Basic 类模块中实现真正的静态类数据。但是,通过使用 Property 过程在标准模块中设置及返回 Public 数据成员的值,可以仿真静态类数据。如以下的代码:
'只读属性返回应用程序的名字。
Property Get CommonString() As String
'变量 gstrVisibleEverywhere 保存在
'标准模块中,并声明为 Public。
CommonString = gstrVisibleEverywhere
End Property
注意 在类模块中,对模块级的变量不能声明为 Static。Static 数据只能在过程中使用。
由 Property Let 过程(对于含有对象引用的属性,使用 Property Set)对标准模块数据成员赋予新的值,可以仿真非只读的静态类数据。然而,这种使用全局变量的方式违背了封装编程的原则,而且不推荐使用。
例如,变量 gstrVisibleEverywhere 可以在工程中任何地方赋值,甚至可以从别的类代码中赋值,只要该类具有 CommonString 属性。这样做能导致程序中非常微妙的错误。
详细信息 ActiveX 部件中的全局数据,与普通程序中的处理方式不同。 如果有 VBP 或 VBE,请参阅《部件工具指南》中的“创建 ActiveX 部件”,“部件设计的一般准则”中的“标准模块与类模块”。
http://www.csdn.net/expert/Topic/453/453566.shtm
Visual Basic 的代码存储在模块中。模块有三种类型:窗体、标准和类。
简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个独立模块,它包含实现公共代码的过程。独立模块应为标准模块。此后可以建立一个包含共享过程的模块库。
每个标准模块、类模块和窗体模块都可包含:
声明。可将常数、类型、变量和动态链接库 (DLL) 过程的声明放在窗体、类或标准模块的模块级。
过程。Sub、Function 或者 Property 过程包含可以作为单元来执行的代码片段。本章后面的“过程概述”一节中将讨论这些内容。
窗体模块
窗体模块(文件扩展名为 .FRM )是大多数 Visual Basic 应用程序的基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、类型和外部过程的窗体级声明。如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值。写入窗体模块的代码是该窗体所属的具体应用程序专用的;它也可以引用该应用程序内的其它窗体或对象。
标准模块
标准模块(文件扩展名为 .BAS)是应用程序内其它模块访问的过程和声明的容器。它们可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。写入标准模块的代码不必绑在特定的应用程序上;如果不小心用名称引用窗体和控件,则在许多不同的应用程序中可以重用标准模块。
类模块
在 Visual Basic 中类模块(文件扩展名为 .CLS)是面向对象编程的基础。可在类模块中编写代码建立新对象。这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模块,在其上可安放控件、可显示窗体窗口。
标准模块,就像一个全局公共的大仓库,什么全局函数,全局变量,全局常量,都往这里头仍;语法根窗体里的写法没什么不同,唯一不同的可能就是一个叫Sub Main的过程,可以作整个工程的引导过程而已。
类模块,就像自家的小仓库,仅仅是类实例化的时候,才用到,里面的函数、变量、常量的作用域仅限于这个类拥有;语法有很多特殊的地方,比如,属性的写法,公有方法,私有方法,事件的写法,构造函数、析构函数、这些根类相关的冬冬。
谢谢大家
一个类模块文件就是一个类的定义,且只能是一个类
一个标准模块却可以包含自定义的函数,过程,或全局变量等。对subclass的callback函数则必须放在标准模块中.
两者不可替代
在数据存储方式上,类不同于标准模块。标准模块的数据不可能多于一份。这意味着若程序中某个部分改动了标准模块的公共变量,随后程序的其它部分读取该变量会得到该值。
相反,类模块数据则独立存在于每个类的实例中。
应避免使类中的代码依赖于全局数据─ 即标准模块中的公共变量。一个类可能同时存在很多个实例,所有这些对象都共享部件中的全局数据。
静态的类数据
在类模块中使用全局变量不符合面向对象编程的封装概念,因为这种类创建的对象没有包含它所有的数据。不过,有时要让同一个类模块创建的所有对象共享一个数据成员。例如,一个类所创建的所有对象要共享一个属性值,如部件的名称或版本号。
这种对封装的故意违反有时称之为静态的类数据。通过使用 Property 过程设置并返回标准模块中的 Public 数据成员,就可以在 Visual Basic 的类模块中实现静态的类数据,如下面代码段所示:
'返回应用程序名的只读 property。
Property Get ComponentName() As String
'变量 gstrComponentName 存储于标准模块中,声明为 Public。
ComponentName = gstrComponentName
End Property
通过提供一个相关的 Property Let 过程─ 或对包含对象引用的属性使用 Property Set 过程─ 给标准模块中的数据成员赋新值,可以实现非只读的静态的类数据。
重点 在设计使用静态数据的类时,要考虑到所写的部件要为若干个客户端应用程序(如果是进程外部件)或者为一个客户端以及若干个进程内部件(如果是进程内部件)提供对象。即使该类创建的所有对象被不同的客户端使用,但都共享该静态数据。
类模块和标准模块的比较
类模块和标准模块的不同点在于存储数据方法的不同。标准模块的数据只有一个备份。这意味着标准模块中一个公共变量的值改变以后,在后面的程序中再读取该变量时,它将得到同一个值。
而类模块的数据,是相对于类实例(也就是,由类创建的每一对象)而独立存在的。
同样的,标准模块中的数据在程序作用域内存在,也就是说,它存在于程序的存活期中;而类实例中的数据只存在于对象的存活期,它随对象的创建而创建,随对象的撤消而消失。
最后,当变量在标准模块中声明为 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 方法显示该对象的数据。
正如图 9.6 所示,结果信息框演示了全局过程 CallableAnywhere 如何设置对象的 Comment 属性,而且全局字符串在 Class1 内部是可见的。
图 9.6 第一个 Class1 对象的信息框
按下 Command2,调用第二个 Class1 类实例的 ShowComment 方法。
如图 9.7 所示,两个对象都访问了全局字符串变量;然而,第二个对象的 Comment 属性是空的,因为对全局过程 CallableAnywhere 的调用只改变第一个对象的 Comment 属性。
图 9.7 第二个 Class1 对象的信息框
重点 要避免类的代码依赖于全局变量,也就是标准模块中的公共变量。一个类的许多实例可以同时存在,所有这些对象在程序中共享全局数据。
在类模块代码中使用全局变量也违背了面向对象封装的编程原则,因为由这样的类所创建的对象并没有包含它们的所有数据。
静态类数据
有时,希望由一个类模块所创建的一些对象共享某个数据项。这就是所谓的静态类数据。
不能在 Visual Basic 类模块中实现真正的静态类数据。但是,通过使用 Property 过程在标准模块中设置及返回 Public 数据成员的值,可以仿真静态类数据。如以下的代码:
'只读属性返回应用程序的名字。
Property Get CommonString() As String
'变量 gstrVisibleEverywhere 保存在
'标准模块中,并声明为 Public。
CommonString = gstrVisibleEverywhere
End Property
注意 在类模块中,对模块级的变量不能声明为 Static。Static 数据只能在过程中使用。
由 Property Let 过程(对于含有对象引用的属性,使用 Property Set)对标准模块数据成员赋予新的值,可以仿真非只读的静态类数据。然而,这种使用全局变量的方式违背了封装编程的原则,而且不推荐使用。
例如,变量 gstrVisibleEverywhere 可以在工程中任何地方赋值,甚至可以从别的类代码中赋值,只要该类具有 CommonString 属性。这样做能导致程序中非常微妙的错误。
详细信息 ActiveX 部件中的全局数据,与普通程序中的处理方式不同。 如果有 VBP 或 VBE,请参阅《部件工具指南》中的“创建 ActiveX 部件”,“部件设计的一般准则”中的“标准模块与类模块”。
http://www.csdn.net/expert/Topic/453/453566.shtm
Visual Basic 的代码存储在模块中。模块有三种类型:窗体、标准和类。
简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个独立模块,它包含实现公共代码的过程。独立模块应为标准模块。此后可以建立一个包含共享过程的模块库。
每个标准模块、类模块和窗体模块都可包含:
声明。可将常数、类型、变量和动态链接库 (DLL) 过程的声明放在窗体、类或标准模块的模块级。
过程。Sub、Function 或者 Property 过程包含可以作为单元来执行的代码片段。本章后面的“过程概述”一节中将讨论这些内容。
窗体模块
窗体模块(文件扩展名为 .FRM )是大多数 Visual Basic 应用程序的基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、类型和外部过程的窗体级声明。如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值。写入窗体模块的代码是该窗体所属的具体应用程序专用的;它也可以引用该应用程序内的其它窗体或对象。
标准模块
标准模块(文件扩展名为 .BAS)是应用程序内其它模块访问的过程和声明的容器。它们可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。写入标准模块的代码不必绑在特定的应用程序上;如果不小心用名称引用窗体和控件,则在许多不同的应用程序中可以重用标准模块。
类模块
在 Visual Basic 中类模块(文件扩展名为 .CLS)是面向对象编程的基础。可在类模块中编写代码建立新对象。这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模块,在其上可安放控件、可显示窗体窗口。
标准模块,就像一个全局公共的大仓库,什么全局函数,全局变量,全局常量,都往这里头仍;语法根窗体里的写法没什么不同,唯一不同的可能就是一个叫Sub Main的过程,可以作整个工程的引导过程而已。
类模块,就像自家的小仓库,仅仅是类实例化的时候,才用到,里面的函数、变量、常量的作用域仅限于这个类拥有;语法有很多特殊的地方,比如,属性的写法,公有方法,私有方法,事件的写法,构造函数、析构函数、这些根类相关的冬冬。
谢谢大家
一个类模块文件就是一个类的定义,且只能是一个类
一个标准模块却可以包含自定义的函数,过程,或全局变量等。对subclass的callback函数则必须放在标准模块中.
两者不可替代