ASP 本身是不存在类这一概念的,这里所说的类为 ASP 支持的脚本语言 VBScript 中Class。VBScript 中类的功能相对比较简单,不具有真正意义上类的继承、重载等特性,但它仍然是非常有用的。使得程序组成更加合理,降低了编程的复杂度。
1.1、什么是类?
类:对象的蓝图
类是对象的符号表示形式。与蓝图描述构成建筑的项一样,类以同样的方式描述组成对象的属性、方法和事件。就像一副蓝图可以用于建成多座建筑一样,一个类 也可以用于根据需要创建多个对象。就像蓝图定义使用建筑的人可以访问建筑的哪些部分一样,类也可以通过封装来控制用户对对象项的访问。
类和对象
“类”和“对象”这两个术语有时互换使用,但实际上,类描述对象的“结构”,而对象是类的可用“实例”。每个实例都是其类的一个精确而又不同的副本。由于对象是类的实例,所以创建对象的操作称为“实例化”。
如果使用蓝图类比,类是蓝图,对象就是基于该蓝图的建筑。通常情况下,更改一个对象中的数据不会更改任何其他对象中的数据。
封装
“封装”是包含和控制对一组关联项的访问的能力。类提供一个最通用的方式来封装项。在下面的示例中,BankAccount 类封装描述银行帐户的方法、字段和属性。
如果没有封装,您就要声明单独的过程和变量来存储和管理银行帐户信息,并且要一次处理多个银行帐户就会比较困难。通过封装,您可以将 BankAccount 类中的数据和过程作为一个单元来使用。您可以同时处理多个银行帐户而不会混淆,因为每个帐户都由该类的一个唯一实例来表示。
封装还使您可以控制如何使用数据和过程。可以使用访问修饰符(如 Private 或 Public )来防止外部过程执行类方法或读取和修改属性和字段中的数据。您应该将类的内部详细信息声明为 Private 以防止它们在类的外部使用;这种技术被称为“数据隐藏”,是对帐户余额等客户信息的保护方式。
封装的一个基本规则是只能通过 Property 过程或方法来修改或检索类数据。隐藏类的实现详细信息可以防止这些类被以不希望的方式使用,并使您在以后修改这类项时没有兼容性问题方面的风险。例 如,BankAccount 类的更高版本可以更改 AccountBalance 字段的数据类型,而不会破坏依赖于此字段拥有特定数据类型的其他应用程序。
1.2、如何创建一个简单的类?
ASP 中创建一个类由 Class 语句声明:
引用内容
Class 语句
声明一个类的名称,以及组成该类的变量、属性和方法的定义。
Class name
statements
End Class
参数
name
必选项。Class 的名称;遵照标准的变量命名约定。
statements
必选项。一个或多个语句,定义了 Class 的变量、属性和方法。
说明
在 Class 块中,成员通过相应的声明语句被声明为 Private 或 Public。被声明为 Private 的将只在 Class 块内是可见的。被声明为 Public 不仅在 Class 块的内部是可见的,对 Class 块之外的代码也是可见的。没有使用 Private 或 Public 明确声明的被默认为 Public。 在类的块内部被声明为 Public 的过程 (Sub 或 Function)将成为类的方法。Public 变量将成为类的属性,同使用 Property Get、Property Let 和 Property Set 显式声明的属性一样。 类的缺省属性和方法是在它们的声明部分用 Default 关键字指定的。关于如何使用该关键字,请参考单独的声明语句主题。
示例:一个简单的 ASP Class 代码
view plaincopy to clipboardprint?Class TestClass
Sub PrintHello() Response.Write
"Hello World!" End Sub End Class
1.3、如何实例化一个类?
view plaincopy to clipboardprint?Dim objClass
' 定义一个类引用对象变量 Set objClass =
New TestClass
' 创建类引用对象 ' 对象名称后加点,再跟成员变量、属性或函数,表示调用该对象的成员变量、属性或函数 ' 这里屏幕将显示 Hello World! objClass.PrintHello
Set objClass =
Nothing ' 释放对象
ASP 类里不能重载构造函数,所以我们不能使用类似于 Set obj = New TestClass("param") 的语句来创建类。
在 ASP 中使用 Set 语句来创建\销毁类对象,有关 Set 语句的更多信息请参看 VBScript 帮助文档。
1.4、ASP 类事件(构造函数、析构函数)
引用内容
Initialize 事件
在创建类的实例时发生此事件。
Private Sub Class_Initialize()
语句
End Sub
当类初始化时,statements部分由零个或多个将要运行的代码语句组成。
Terminate 事件
在所关联的类的实例终止时发生此事件。
Private Sub Class_Terminate()
语句
End Sub
当类初始化时,statements 部分由零个或多个将要运行的代码语句组成。
示例:
view plaincopy to clipboardprint?Class TestClass
' 该函数为构造函数,在使用 Set 创建对象时自动执行 Private Sub Class_Initialize
' 设置 Initialize 事件。 ResPonse.Write(
"TestClass started")
End Sub ' 该函数为析构函数,在使用 Set 释放对象时自动执行 Private Sub Class_Terminate
' 设置 Terminate 事件。 ResPonse.Write(
"TestClass terminated")
End Sub End Class Dim objT
Set objT =
New TestClass
' 创建一个 TestClass 实例。 Set objT =
Nothing ' 删除实例。
执行以上程序屏幕将显示:TestClass startedTestClass terminated
1.5、ASP 类成员变量、成员函数
ASP 类中成员变量(函数)有“公有”、“私有”之分,分别使用 Public、Private 语句来定义。
引用内容
Dim 语句
声明变量并分配存储空间。
Dim varname[([subscripts])][, varname[([subscripts])]] . . .
Public 语句
定义公有变量并分配存储空间。在 Class 块中定义私有变量。
Public varname[([subscripts])][, varname[([subscripts])]] . . .
Private 语句
定义私有变量并分配存储空间。在 Class块中定义私有变量。
Private varname[([subscripts])][, varname[([subscripts])]] . . .
参数
varname
变量的名称;遵循标准变量命名约定。
subscripts
数组变量的维数,最多可以声明 60 维的数组。subscripts 参数使用下列语法:
upper [, upper] . . .
数组的下界总是 0。
注意 在过程中使用 Private 语句时,通常将 Private 语句放在过程的开始处。
用 Dim 声明的 Script 级变量可用于脚本中的所有过程,过程级变量只能用于过程中。
Public语句变量可用于全部脚本中的所有过程。
Private 语句变量只能在声明该变量的脚本中使用。
如没有显式指定使用 Public或 Private,则 Function、Sub 过程默认为公用,即它们对于脚本中的所有其他过程是可见的。
有关公有、私有的更多信息请参看 VBScript 帮助文档。
示例:公有成员变量、私有成员变量、公有成员函数、私有成员函数
view plaincopy to clipboardprint?Class TestClass
Dim PublicParam
' 用 Dim 申明公有成员变量 Private PrivateParam
' 用 Private 申明私有成员变量 'PublicParam = "公有" ' 不能在 Class 标记以内,类函数以外为成员变量赋值,否则报语法错误 'Const intMax = 5 ' 不能在 Class 标记以内,类函数以外使用 Const,否则报语法错误 ' 该函数为构造函数,在使用 Set 创建对象时自动执行 Private Sub Class_Initialize
' 设置 Initialize 事件。 ' 在这里可以为成员变量赋值 PublicParam =
"公有" PrivateParam =
"私有" End Sub ' 该函数为析构函数,在释放对象时自动执行 Private Sub Class_Terminate
' 设置 Terminate 事件。 ResPonse.Write
"释放对象" End Sub '公有成员函数(过程),这里可不写 Public 语句 '成员函数(过程)不需要也不能申明 Public Sub PrintParam(i)
If i = 1
Then Call PrintPublicParam()
ElseIf i = 2
Then Call PrintPrivateParam()
End If End Sub '私有成员函数(过程),比公有成员函数(过程)多一个 Private 语句 Private Sub PrintPublicParam() Response.Write PublicParam
End Sub Private Sub PrintPrivateParam() Response.Write PrivateParam
End Sub End Class Dim objT
Set objT =
New TestClass
' 创建实例后自动调用 Class_Initialize 函数,为 PublicParam、PrivateParam 赋值 Response.Write objT.PublicParam
' 输出:公有 'Response.Write objT.PrivateParam ' 将发生错误,PrivateParam 为私有变量 '赋新值 objT.PublicParam =
"新的公有" 'objT.PrivateParam = "新的私有" ' 错误,同上 objT.PrintParam(1)
' 输出 PublicParam 的值:新的公有 objT.PrintParam(2)
' 输出 PrivateParam 的值:私有 '将发生错误,私有函数 'objT.PrintPublicParam 'objT.PrintPrivateParam Set objT=
Nothing
1.6、ASP 类属性
类对外公开一个属性(变量)时有两种做法:
1、使用 Public 声明变量,这样在外部就可以直接读写这个变量。
2、 使用 Private 声明变量,然后使用 Property Let / Property Get 过程对外公开这个属性(只写/只读),在 Property 过程中可加入数据合法性验证代码,任何读写这个属性的外部过程都必须先通过 Property 过程的合法性验证,这就是所谓的封装,使得类更加强健。
事实上即使我们使用 Public 声明属性,VB 在后台总是用第二种方法进行处理这个属性。
当这个变量是一个对象变量(Object)时,使用 Property Set 过程来引用。
有关 Property Let / Property Get / Property Set 语句的更多信息请参看 VBScript 帮助文档。
引用内容
Property Let 语句
在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。
[Public | Private] Property Let name (
[arglist,] value
)
[statement]
[Exit Property]
[statement]
End Property
参数
Public
表明 Property Let 过程可以被所有脚本中的其他所有过程访问。
Private
表明 Property Let 过程只能被定义之的 Class 块内的其他过程访问。
name
Property Let 过程的名称;遵守标准的变量命名规则,区别仅仅在于其名称可以与相同 Class 块中的 Property Get 或 Property Set 过程相同。
arglist
该 变量列表代表了在调用时被传递到 Property Let 过程的参数。多个参数之间用逗号隔开。Property Let 过程的每个参数的名字必须与 Property Get 过程中的相应参数相同。此外, Property Let 过程的参数比相应的 Property Get 过程总要多一个。该参数为被赋予属性的值。
value
该变量中包含要赋予属性的值。当过程被调用时,该参数将出现在调用表达式的右侧。
statement
任意的一组语句,将在 Property Let 过程的主体内执行。
注意每个 Property Let 语句必须为所定义的属性定义至少一个参数。该参数(在存在多个参数时的最后一个参数)包含了当 Property Let 语句被调用时要赋予属性的值。该参数在前面的语法中被称为value。
说明
如果未明确地使用 Public 或 Private进行指定,Property Let 过程被缺省设置为公有的,即它们对于脚本内的其他所有过程都是可见的。Property Let过程中的局部变量的值在不同的过程调用之间是不被保存的。
在其他任何过程(例如 Function 或 Property Get)的内部不能够定义 Property Let 过程。
Exit Property 语句将导致立即从 Property Let 过程中退出。程序将从调用 Property Let 过程的语句之后的点继续执行。Exit Property 语句可以出现在 Property Let 过程中的任何位置,次数不限。
与 Function 和 Property Get 过程类似,Property Let 过程是一个单独的过程,它可以接受参数,执行一系列的语句,还可以改变参数的值。不过,与Function 和 Property Get 过程不同的是,它们两者都返回一个值,而Property Let过程只能用于属性赋值表达式的左侧。
示例:一个简单的属性读写
view plaincopy to clipboardprint?Class TestClass
Private strName
Private intAge
Private Sub Class_Initialize strName =
"张三" ' 设置默认姓名 intAge = 18
' 设置默认年龄 End Sub ' 属性只写 Property Let Name(p) strName = p
End Property ' 属性只读 Property Get Name() Name = strName
End Property Property Let Age(i)
' 若年龄范围介于[0-100]则赋值,否则置为-1 If i >= 0
And i <= 100
Then intAge = i
Else intAge = -1
End If End Property Property Get Age() Age = intAge
End Property End Class Dim objT
Set objT =
New TestClass Response.Write objT.Name
' 输出:张三 Response.Write objT.Age
' 输出:18 objT.Name =
"李四" ' 设置姓名 objT.Age = 20
' 设置年龄 Response.Write objT.Name
' 输出:李四 Response.Write objT.Age
' 输出:20 objT.Name =
"王五" ' 设置姓名 objT.Age = 101
' 设置年龄 Response.Write objT.Name
' 输出:王五 Response.Write objT.Age
' 输出:-1 Set objT =
Nothing
1.7、ASP 多类组合使用实现复杂应用
VBS 语言是基于对象而非面向对象,决定了其类不支持继承、重载、派生等特性。所以在实现复杂应用时我们只能使用类组合来实现。
示例:一个简单的类组合
view plaincopy to clipboardprint?Class cFish
Sub Swim() Response.Write
"海阔凭鱼跃" End Sub End Class Class cBird
Sub Fly() Response.Write
"天高任鸟飞" End Sub End Class Class Animal
Dim Fish
Dim Bird
Private Sub Class_Initialize()
Set Fish =
New cFish
Set Bird =
New cBird
End Sub Private Sub Class_Terminate()
Set Fish =
Nothing Set Bird =
Nothing End Sub End Class Dim objAnimal
Set objAnimal =
New Animal objAnimal.Fish.Swim()
' 输出:海阔凭鱼跃 objAnimal.Bird.Fly()
' 输出:天高任鸟飞 Set objAnimal =
Nothing