1
前言
2
首先,在我进入实质性主题并解释如何建立类之前,我希望保证你知道“对象”。虽然你可以在程序中使用对象而不用知道其正确的规则,但我并不建议如此!对于对象的初学者,接下来的部分将让你了解其概念及内容。已经了解面向对象编程(OOP)的读者可以跳过这章节。
3
导论
4
“对象是什么?”——对象通常代表某种实体,主要是一个变量和函数的集合。
5
“实体是什么?”——字面上说,实体是一个“事物”,我的意思是一个概念或者任何一个物体。例如,一辆汽车是一个实体,因为它是一个物体。你公司销售部门销售产品也是一个实体,当然,你也可以将其拆开来看,销售人员、客户、产品等都是实体。
6
让我们更深入的来看“销售”这个实体(对象)。为了使你更准确地有一个销售的“映像”,你需要知道客户买了什么,是哪个客户,谁是销售人员等等……这看来是一个简单的事件,但假设所有信息是存储在单独的数据库表中的,那么当你需要获得某个销售过程所有相关信息时,你必须在你的数据库中做多次独立查询,再将所有的数据集拢。有没有更简便的办法而一次获得销售的所有信息呢?“对象”。
7
在对象中,你可以植入代码以从其他表中获得数据,你也可以保存对象属性的所有信息,这样,你可以轻松地使用代码管理你的销售数据。例如:
8
9
'Open the database connection
10
Set objConn = Server.CreateObject("ADODB.Connection")
11
objConn.Open "MyDSN"
12
13
'Create the recordset object
14
Set objRS = Server.CreateObject("ADODB.Recordset")
15
16
'Define the SQL query
17
strComplexSQLQuery = "SELECT C.Name, S.Name FROM Customers C, " & _
18
"Salespeople S, Sales Sl WHERE Sl.CustomerID=C.ID AND " & _
19
"Sl.SalespersonID=S.ID AND Sl.ID=" & strIDOfThisSale & ";"
20
21
'Open the recordset
22
objRS.Open strComplexSQLQuery, objConn, adOpenForwardOnly, _
23
adLockReadOnly, adCmdText
24
25
'Take the customer and sales person names from the recordset
26
strCustomerName = objRS(0)
27
strSalesPersonName = objRS(1)
28
29
'Tidy up the objects
30
objRS.Close
31
objConn.Close
32
Set objRS = Nothing
33
Set objConn = Nothing
34
35
'Output the data
36
Response.Write "This sale was made by " & strSalesPersonName & _
37
" to " & strCustomerName
38
39
40
可以使用“对象”来替代:
41
42
'Create the "Sale" object
43
Set objSale = New Sale
44
45
'Lookup the correct sale
46
objSale.ID = strIDOfThisSale
47
48
'Output the data
49
Response.Write "This sale was made by " & objSale.SalesPersonName & _
50
" to " & objSale.CustomerName
51
52
'Tidy up the objects
53
objSale.Close
54
Set objSale = Nothing
55
如果你使用“Sale”对象做比打印更多的事,可以让你省去很多的打字时间。
56
57
计算中,对象包括“属性”和“方法”。属性主要是储存在对象中的一个变量,其用法与变量相同。唯一的区别在于参数赋值为:strMyVar = "This is a string variant", 而对象属性为 objObject.Property="This is a string variant"。这点非常简单而有用处。方法可以理解为植入对象中的函数与过程,可以使用strMyVar = objObject.MethodName(strMyVar)来代替strMyVar =FunctionName(strMyVar)。写法不同,但功能相同。属性的一个例子是对象Response中的ExpireAbsolute,Response.ExpiresAbsolute = CDate("1 September 1999")。方法的一个例子是对象Response中的Write方法,Response.Write "Hello world!"。
58
VBScript的一个新特性就是其可以创建新的对象而不需要求诸于花销时间都极大的编译器。我将向读者展示如何创建对象的类,并希望提供一个良好的开端。
59
60
在VBScript中使用类(二)
61
创建对象
62
在VBScript中创建对象类型(类)时,你首先要知道,这真的很容易!我在一个下午自学,只是阅读了Microsof VB Script 的参考书,但必须承认,这书不是最容易阅读的文档。
63
初学者需要安装VBScript 5.0引擎,可以在Microsoft's Scripting Site下载。
64
我们来看代码。类的定义与函数和子过程非常类似。起始行为Class <MyClassName>,结尾是End Class,所有的对象定义写在中间部门。现在我们可以用所学的来建立第一个类,不实现任何功能的类。
65
Class 4GuysTestObject
66
'你的ASP代码
67
End Class
68
这看上去不是那么回事,但当你写入下面的代码后,你将创建一个对象的实例:
69
Dim objTestObject
70
Set objTestObject = New 4GuysTestObject
71
Set objTestObject = Nothing
72
显然,我们现在还不能用对象做任何事,现在我将解释如何在对象中定义属性和方法。
73
使用对象可以做的最基础的,是建立一组数据。例如,假如要将时间、日期及视频程序标题建立在一起,你可以创建一个包含属性“StartTime”, “ProgramDate”和“ProgramTitle”的对象。代码如下:
74
75
Class TVProgram
76
77
Public StartTime
78
Public ProgramDate
79
Public ProgramTitle
80
81
End Class
82
83
Dim objTVShow
84
Set objTVShow = New TVProgram
85
86
objTVShow.StartTime = CDate("17:30")
87
objTVShow.ProgramDate = DateSerial(1999,9,17)
88
objTVShow.ProgramTitle = "The Jerry Springer Show"
89
90
Response.Write objTVShow.ProgramTitle & " is on at " & _
91
objTVShow.StartTime & " on " & objTVShow.ProgramDate
92
93
代码工作的方式是,我们定义StartTime,ProgramDate和ProgramTitle为类TVProgram的属性。这样,这些属性就像其他变量一样来处理,没有设置值则不会执行代码。属性名字前的Public字段有其真实含义,而且非常重要。如果你不特指一个方法或属性为public或private,系统默认值为public,但最好养成定义任何值的良好书写习惯(也方便你之后自己的阅读)。
94
95
上面程序的结果大致如下(决定于你的本地服务器配置):
96
97
The Jerry Springer Show is on at 5:30pm on 17/09/99.
98
99
我在英国,所以日期现实如上。不论你跑什么工程,它的效果都不错,但只有你开始使用其他对象的功能,为你可能需要的所有信息和功能,创建一个完美的接口,以支持你所建对象包围的实体,你才会体会到对象的真正实力。
100
现在,如果你不喜欢上面例子显示日期的方法,而希望以同一种格式现实日期,也没有不要在引用每个ProgramDate属性时加FormatDateTime(),你只需要将此类代码植入属性本身。
101
102
这样需要用另一种方法定义属性。同样,我们将使用ProgramDate为外部可见属性,但因为ProgramDate属性将成为一个函数而不是静态值,我们将实际日期保存在另一个属性中internal_ProgramDate。
103
104
Class TVProgram
105
106
Public StartTime
107
Public internal_ProgramDate
108
109
Public Property Get ProgramDate
110
ProgramDate = Day(internal_ProgramDate) & _
111
" " & MonthName(Month(internal_ProgramDate)) & _
112
" " & Year(internal_ProgramDate)
113
End Property
114
115
Public ProgramTitle
116
End Class
117
118
Dim objTVShow
119
Set objTVShow = New TVProgram
120
121
objTVShow.StartTime = CDate("17:30")
122
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)
123
objTVShow.ProgramTitle = "The Jerry Springer Show"
124
125
Response.Write objTVShow.ProgramTitle & " is on at " & _
126
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
127
128
129
程序的结果如下:
130
131
The Jerry Springer Show is on at 5:30pm on 17 September 1999.
132
133
在VBScript中使用类(三)
134
135
我们来分析一下(2)中的程序:
136
137
Class TVProgram
138
139
Public StartTime
140
141
Public internal_ProgramDate
142
143
Public Property Get ProgramDate
144
145
ProgramDate = Day(internal_ProgramDate) & _
146
147
" " & MonthName(Month(internal_ProgramDate)) & _
148
149
" " & Year(internal_ProgramDate)
150
151
End Property
152
153
Public ProgramTitle
154
155
End Class
156
157
Dim objTVShow
158
159
Set objTVShow = New TVProgram
160
161
objTVShow.StartTime = CDate("17:30")
162
163
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)
164
165
objTVShow.ProgramTitle = "The Jerry Springer Show"
166
167
Response.Write objTVShow.ProgramTitle & " is on at " & _
168
169
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
170
171
当调用对象的属性ProgramDate时,实际上执行了函数ProgramDate,即如上定义的函数,而很快你也将习惯这种在声明部分使用Public或Private关键字的方式。关键字“Property”,告知了编译器如同调用属性一样在外部调用函数。接着的“Get”,表明该函数是输出还是获得一个值。
172
173
Get的意思是“允许外部代码去‘获取’一个值”,与其类似的关键字还有“Let”和“Set”,但这两个比较复杂,因而我们以后再讨论。
174
175
接下去的代码看来有点难度的,给objectname.internal_ProgramDate赋值并通过objectname.ProgramDate来调用它。如果可以使用相同关键字同时为其赋值并获得它的值不是更好吗?当然,那也可以。
176
177
如果定义Get和Let属性的名称相同,可以将它们当作对象相同的属性,但这只限于它们定义了相同数量的成员。(以下代码看来不太相同,仅作为实例参考)
178
179
Class TVProgram
180
181
Public StartTime
182
183
Public internal_ProgramDate
184
185
Public Property Get ProgramDate
186
187
ProgramDate = Day(internal_ProgramDate) & " " _
188
189
& MonthName(Month(internal_ProgramDate)) & _
190
191
" " & Year(internal_ProgramDate)
192
193
End Property
194
195
Public Property Let ProgramDate(ByVal varDateIn)
196
197
internal_ProgramDate = CDate(varDateIn)
198
199
End Property
200
201
Public ProgramTitle
202
203
End Class
204
205
Dim objTVShow
206
207
Set objTVShow = New TVProgram
208
209
objTVShow.StartTime = CDate("17:30")
210
211
objTVShow.ProgramDate = "17 Sept 99"
212
213
objTVShow.ProgramTitle = "The Jerry Springer Show"
214
215
Response.Write objTVShow.ProgramTitle & " is on at " & _
216
217
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
218
219
以上代码中Let的声明部分看来似乎是一个多余的元素,当我第一次看到时研究了很长时间。每次我使用“0”作为变量用在每个属性上,我总是得到这个错误信息,“元素数量必须相等”。“它们确实相等!”抓狂之后,我回过头去看程序才觉得自己的愚蠢!:)
220
221
原因是,当你试图为ProgramDate赋值时,你会使用这样一行程序:
222
223
objTVShow.ProgramDate = dtmMyDate
224
225
为了方便,等号右边的值(这里指dtmMyDate)作为了一个程元赋给了函数。因此编译器可能会认为在Get ProgramDate行有0程元,而Let ProgramDate却多一个!分配的值总是被略过而作为属性的最后一个程元,所以即使你使用其他程元,所赋的值总是作为最后一个程元。
226
227
现在看程序。无论通过ProgramDate设置日期为文本形式,还是用internal_ProgramDate译成日期变量,程序都没有问题。但能不能只使用一个入口呢?
228
229
如果internal_ProgramDate只能在内部有效,而使用Let ProgramDate检查传输的数据类型,我们就可以作出选择。例如:
230
231
Class TVProgram
232
233
Public StartTime
234
235
Private internal_ProgramDate
236
237
Public Property Get ProgramDate
238
239
ProgramDate = Day(internal_ProgramDate) & " " & _
240
241
MonthName(Month(internal_ProgramDate)) & _
242
243
" " & Year(internal_ProgramDate)
244
245
End Property
246
247
Public Property Let ProgramDate(ByVal varDateIn)
248
249
If IsDate(varDateIn) Then
250
251
internal_ProgramDate = varDateIn
252
253
Else
254
255
'Place some error handling code in here.
256
257
End If
258
259
End Property
260
261
Public ProgramTitle
262
263
End Class
264
265
并同样声明StartTime属性:
266
267
Class TVProgram
268
269
Private internal_StartTime
270
271
Public Property Get StartTime
272
273
StartTime = Hour(internal_StartTime) & ":" _
274
275
& Minute(internal_StartTime)
276
277
End Property
278
279
Public Property Let StartTime(ByVal varTimeIn)
280
281
If IsDate(varTimeIn) Then
282
283
internal_StartTime = varTimeIn
284
285
End If
286
287
End Property
288
289
Private internal_ProgramDate
290
291
Public Property Get ProgramDate
292
293
ProgramDate = Day(internal_ProgramDate) & " " _
294
295
& MonthName(Month(internal_ProgramDate)) & _
296
297
" " & Year(internal_ProgramDate)
298
299
End Property
300
301
Public Property Let ProgramDate(ByVal varDateIn)
302
303
If IsDate(varDateIn) Then
304
305
internal_ProgramDate = varDateIn
306
307
End If
308
309
End Property
310
311
Public ProgramTitle
312
313
End Class
314

315
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。我们将在第四部分讨论这点。
316
在VBScript中使用类(四)
317
318
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。创建一个ASP页面,并命名为TVProgramClass.asp,我们在其中定义类TVProgram。
319
--TVProgramClass.asp--
320
<%
321
Class TVProgram
322
Private internal_StartTime
323
Public Property Get StartTime
324
325
StartTime = Hour(internal_StartTime) & _
326
327
":" & Minute(internal_StartTime)
328
329
End Property
330
Public Property Let StartTime(ByVal varTimeIn)
331
332
If IsDate(varTimeIn) Then
333
334
internal_StartTime = varTimeIn
335
336
End If
337
338
End Property
339
Private internal_ProgramDate
340
Public Property Get ProgramDate
341
ProgramDate = Day(internal_ProgramDate) & _
342
" " & MonthName(Month(internal_ProgramDate)) & _
343
344
" " & Year(internal_ProgramDate)
345
346
End Property
347
348
Public Property Let ProgramDate(ByVal varDateIn)
349
If IsDate(varDateIn) Then
350
internal_ProgramDate = varDateIn
351
End If
352
End Property
353
354
Public ProgramTitle
355
356
End Class
357
%>
358
这样就可以在任何ASP中调用我们定义的类了,语法如下:
359
<!-- #include virtual="TVProgramClass.asp" -->
360
<%
361
Dim objTVShow
362
Set objTVShow = New TVProgram
363
364
objTVShow.StartTime = CDate("17:30")
365
objTVShow.ProgramDate = DateSerial(1999,9,17)
366
objTVShow.ProgramTitle = "The Jerry Springer Show"
367
368
%>
369
<%= objTVShow.ProgramTitle %> is on at <%= objTVShow.StartTime %> on <%= objTVShow.ProgramDate %>.
370
这里有一个建议。如果你重命名你的包含文件.asp,并保证所有重要代码都在<CODE><%
%>< CODE>中,那么就算有人猜到了你包含文件的文件名,也没办法看见里面的内容!
371
372
评论:
373
VBScript类在封装的层面上,还是有不少好处的,增加了代码的可读性与可维护性以及清晰度,但是,没有继承和重载等特性,并不是真正意义上的OOP。没有集合,但是据说可以用Scripting.Dictionary,据说更好用、更快。不过,感觉总是鸡类(肋)。
前言2
首先,在我进入实质性主题并解释如何建立类之前,我希望保证你知道“对象”。虽然你可以在程序中使用对象而不用知道其正确的规则,但我并不建议如此!对于对象的初学者,接下来的部分将让你了解其概念及内容。已经了解面向对象编程(OOP)的读者可以跳过这章节。 3
导论4
“对象是什么?”——对象通常代表某种实体,主要是一个变量和函数的集合。5
“实体是什么?”——字面上说,实体是一个“事物”,我的意思是一个概念或者任何一个物体。例如,一辆汽车是一个实体,因为它是一个物体。你公司销售部门销售产品也是一个实体,当然,你也可以将其拆开来看,销售人员、客户、产品等都是实体。6
让我们更深入的来看“销售”这个实体(对象)。为了使你更准确地有一个销售的“映像”,你需要知道客户买了什么,是哪个客户,谁是销售人员等等……这看来是一个简单的事件,但假设所有信息是存储在单独的数据库表中的,那么当你需要获得某个销售过程所有相关信息时,你必须在你的数据库中做多次独立查询,再将所有的数据集拢。有没有更简便的办法而一次获得销售的所有信息呢?“对象”。7
在对象中,你可以植入代码以从其他表中获得数据,你也可以保存对象属性的所有信息,这样,你可以轻松地使用代码管理你的销售数据。例如:8

9
'Open the database connection10
Set objConn = Server.CreateObject("ADODB.Connection")11
objConn.Open "MyDSN"12

13
'Create the recordset object14
Set objRS = Server.CreateObject("ADODB.Recordset")15

16
'Define the SQL query17
strComplexSQLQuery = "SELECT C.Name, S.Name FROM Customers C, " & _18
"Salespeople S, Sales Sl WHERE Sl.CustomerID=C.ID AND " & _19
"Sl.SalespersonID=S.ID AND Sl.ID=" & strIDOfThisSale & ";"20

21
'Open the recordset22
objRS.Open strComplexSQLQuery, objConn, adOpenForwardOnly, _23
adLockReadOnly, adCmdText24

25
'Take the customer and sales person names from the recordset26
strCustomerName = objRS(0)27
strSalesPersonName = objRS(1)28

29
'Tidy up the objects30
objRS.Close31
objConn.Close32
Set objRS = Nothing33
Set objConn = Nothing34

35
'Output the data36
Response.Write "This sale was made by " & strSalesPersonName & _37
" to " & strCustomerName38

39

40
可以使用“对象”来替代:41

42
'Create the "Sale" object43
Set objSale = New Sale44

45
'Lookup the correct sale46
objSale.ID = strIDOfThisSale47

48
'Output the data49
Response.Write "This sale was made by " & objSale.SalesPersonName & _50
" to " & objSale.CustomerName51

52
'Tidy up the objects53
objSale.Close54
Set objSale = Nothing55
如果你使用“Sale”对象做比打印更多的事,可以让你省去很多的打字时间。56

57
计算中,对象包括“属性”和“方法”。属性主要是储存在对象中的一个变量,其用法与变量相同。唯一的区别在于参数赋值为:strMyVar = "This is a string variant", 而对象属性为 objObject.Property="This is a string variant"。这点非常简单而有用处。方法可以理解为植入对象中的函数与过程,可以使用strMyVar = objObject.MethodName(strMyVar)来代替strMyVar =FunctionName(strMyVar)。写法不同,但功能相同。属性的一个例子是对象Response中的ExpireAbsolute,Response.ExpiresAbsolute = CDate("1 September 1999")。方法的一个例子是对象Response中的Write方法,Response.Write "Hello world!"。58
VBScript的一个新特性就是其可以创建新的对象而不需要求诸于花销时间都极大的编译器。我将向读者展示如何创建对象的类,并希望提供一个良好的开端。59

60
在VBScript中使用类(二)61
创建对象62
在VBScript中创建对象类型(类)时,你首先要知道,这真的很容易!我在一个下午自学,只是阅读了Microsof VB Script 的参考书,但必须承认,这书不是最容易阅读的文档。63
初学者需要安装VBScript 5.0引擎,可以在Microsoft's Scripting Site下载。64
我们来看代码。类的定义与函数和子过程非常类似。起始行为Class <MyClassName>,结尾是End Class,所有的对象定义写在中间部门。现在我们可以用所学的来建立第一个类,不实现任何功能的类。65
Class 4GuysTestObject66
'你的ASP代码67
End Class68
这看上去不是那么回事,但当你写入下面的代码后,你将创建一个对象的实例:69
Dim objTestObject70
Set objTestObject = New 4GuysTestObject71
Set objTestObject = Nothing72
显然,我们现在还不能用对象做任何事,现在我将解释如何在对象中定义属性和方法。73
使用对象可以做的最基础的,是建立一组数据。例如,假如要将时间、日期及视频程序标题建立在一起,你可以创建一个包含属性“StartTime”, “ProgramDate”和“ProgramTitle”的对象。代码如下:74

75
Class TVProgram76

77
Public StartTime78
Public ProgramDate79
Public ProgramTitle80

81
End Class82

83
Dim objTVShow84
Set objTVShow = New TVProgram85

86
objTVShow.StartTime = CDate("17:30")87
objTVShow.ProgramDate = DateSerial(1999,9,17)88
objTVShow.ProgramTitle = "The Jerry Springer Show"89

90
Response.Write objTVShow.ProgramTitle & " is on at " & _91
objTVShow.StartTime & " on " & objTVShow.ProgramDate92

93
代码工作的方式是,我们定义StartTime,ProgramDate和ProgramTitle为类TVProgram的属性。这样,这些属性就像其他变量一样来处理,没有设置值则不会执行代码。属性名字前的Public字段有其真实含义,而且非常重要。如果你不特指一个方法或属性为public或private,系统默认值为public,但最好养成定义任何值的良好书写习惯(也方便你之后自己的阅读)。94

95
上面程序的结果大致如下(决定于你的本地服务器配置):96

97
The Jerry Springer Show is on at 5:30pm on 17/09/99.98

99
我在英国,所以日期现实如上。不论你跑什么工程,它的效果都不错,但只有你开始使用其他对象的功能,为你可能需要的所有信息和功能,创建一个完美的接口,以支持你所建对象包围的实体,你才会体会到对象的真正实力。100
现在,如果你不喜欢上面例子显示日期的方法,而希望以同一种格式现实日期,也没有不要在引用每个ProgramDate属性时加FormatDateTime(),你只需要将此类代码植入属性本身。101

102
这样需要用另一种方法定义属性。同样,我们将使用ProgramDate为外部可见属性,但因为ProgramDate属性将成为一个函数而不是静态值,我们将实际日期保存在另一个属性中internal_ProgramDate。103

104
Class TVProgram105

106
Public StartTime107
Public internal_ProgramDate108

109
Public Property Get ProgramDate110
ProgramDate = Day(internal_ProgramDate) & _111
" " & MonthName(Month(internal_ProgramDate)) & _112
" " & Year(internal_ProgramDate)113
End Property114

115
Public ProgramTitle116
End Class117

118
Dim objTVShow119
Set objTVShow = New TVProgram120

121
objTVShow.StartTime = CDate("17:30")122
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)123
objTVShow.ProgramTitle = "The Jerry Springer Show"124

125
Response.Write objTVShow.ProgramTitle & " is on at " & _126
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."127

128

129
程序的结果如下:130

131
The Jerry Springer Show is on at 5:30pm on 17 September 1999.132

133
在VBScript中使用类(三)134

135
我们来分析一下(2)中的程序:136

137
Class TVProgram138

139
Public StartTime140

141
Public internal_ProgramDate142

143
Public Property Get ProgramDate144

145
ProgramDate = Day(internal_ProgramDate) & _146

147
" " & MonthName(Month(internal_ProgramDate)) & _148

149
" " & Year(internal_ProgramDate)150

151
End Property152

153
Public ProgramTitle154

155
End Class156

157
Dim objTVShow158

159
Set objTVShow = New TVProgram160

161
objTVShow.StartTime = CDate("17:30")162

163
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)164

165
objTVShow.ProgramTitle = "The Jerry Springer Show"166

167
Response.Write objTVShow.ProgramTitle & " is on at " & _168

169
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."170

171
当调用对象的属性ProgramDate时,实际上执行了函数ProgramDate,即如上定义的函数,而很快你也将习惯这种在声明部分使用Public或Private关键字的方式。关键字“Property”,告知了编译器如同调用属性一样在外部调用函数。接着的“Get”,表明该函数是输出还是获得一个值。172

173
Get的意思是“允许外部代码去‘获取’一个值”,与其类似的关键字还有“Let”和“Set”,但这两个比较复杂,因而我们以后再讨论。174

175
接下去的代码看来有点难度的,给objectname.internal_ProgramDate赋值并通过objectname.ProgramDate来调用它。如果可以使用相同关键字同时为其赋值并获得它的值不是更好吗?当然,那也可以。176

177
如果定义Get和Let属性的名称相同,可以将它们当作对象相同的属性,但这只限于它们定义了相同数量的成员。(以下代码看来不太相同,仅作为实例参考)178

179
Class TVProgram180

181
Public StartTime182

183
Public internal_ProgramDate184

185
Public Property Get ProgramDate186

187
ProgramDate = Day(internal_ProgramDate) & " " _188

189
& MonthName(Month(internal_ProgramDate)) & _190

191
" " & Year(internal_ProgramDate)192

193
End Property194

195
Public Property Let ProgramDate(ByVal varDateIn)196

197
internal_ProgramDate = CDate(varDateIn)198

199
End Property200

201
Public ProgramTitle202

203
End Class204

205
Dim objTVShow206

207
Set objTVShow = New TVProgram208

209
objTVShow.StartTime = CDate("17:30")210

211
objTVShow.ProgramDate = "17 Sept 99"212

213
objTVShow.ProgramTitle = "The Jerry Springer Show"214

215
Response.Write objTVShow.ProgramTitle & " is on at " & _216

217
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."218

219
以上代码中Let的声明部分看来似乎是一个多余的元素,当我第一次看到时研究了很长时间。每次我使用“0”作为变量用在每个属性上,我总是得到这个错误信息,“元素数量必须相等”。“它们确实相等!”抓狂之后,我回过头去看程序才觉得自己的愚蠢!:)220

221
原因是,当你试图为ProgramDate赋值时,你会使用这样一行程序:222

223
objTVShow.ProgramDate = dtmMyDate224

225
为了方便,等号右边的值(这里指dtmMyDate)作为了一个程元赋给了函数。因此编译器可能会认为在Get ProgramDate行有0程元,而Let ProgramDate却多一个!分配的值总是被略过而作为属性的最后一个程元,所以即使你使用其他程元,所赋的值总是作为最后一个程元。226

227
现在看程序。无论通过ProgramDate设置日期为文本形式,还是用internal_ProgramDate译成日期变量,程序都没有问题。但能不能只使用一个入口呢?228

229
如果internal_ProgramDate只能在内部有效,而使用Let ProgramDate检查传输的数据类型,我们就可以作出选择。例如:230

231
Class TVProgram232

233
Public StartTime234

235
Private internal_ProgramDate236

237
Public Property Get ProgramDate238

239
ProgramDate = Day(internal_ProgramDate) & " " & _240

241
MonthName(Month(internal_ProgramDate)) & _242

243
" " & Year(internal_ProgramDate)244

245
End Property246

247
Public Property Let ProgramDate(ByVal varDateIn)248

249
If IsDate(varDateIn) Then250

251
internal_ProgramDate = varDateIn252

253
Else254

255
'Place some error handling code in here.256

257
End If258

259
End Property260

261
Public ProgramTitle262

263
End Class264

265
并同样声明StartTime属性:266

267
Class TVProgram268

269
Private internal_StartTime270

271
Public Property Get StartTime272

273
StartTime = Hour(internal_StartTime) & ":" _274

275
& Minute(internal_StartTime)276

277
End Property278

279
Public Property Let StartTime(ByVal varTimeIn)280

281
If IsDate(varTimeIn) Then282

283
internal_StartTime = varTimeIn284

285
End If286

287
End Property288

289
Private internal_ProgramDate290

291
Public Property Get ProgramDate292

293
ProgramDate = Day(internal_ProgramDate) & " " _294

295
& MonthName(Month(internal_ProgramDate)) & _296

297
" " & Year(internal_ProgramDate)298

299
End Property300

301
Public Property Let ProgramDate(ByVal varDateIn)302

303
If IsDate(varDateIn) Then304

305
internal_ProgramDate = varDateIn306

307
End If308

309
End Property310

311
Public ProgramTitle312

313
End Class314

315
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。我们将在第四部分讨论这点。316
在VBScript中使用类(四)317

318
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。创建一个ASP页面,并命名为TVProgramClass.asp,我们在其中定义类TVProgram。319
--TVProgramClass.asp--320
<%321
Class TVProgram322
Private internal_StartTime323
Public Property Get StartTime324

325
StartTime = Hour(internal_StartTime) & _326

327
":" & Minute(internal_StartTime)328

329
End Property330
Public Property Let StartTime(ByVal varTimeIn)331

332
If IsDate(varTimeIn) Then333

334
internal_StartTime = varTimeIn335

336
End If337

338
End Property339
Private internal_ProgramDate340
Public Property Get ProgramDate341
ProgramDate = Day(internal_ProgramDate) & _342
" " & MonthName(Month(internal_ProgramDate)) & _343

344
" " & Year(internal_ProgramDate)345

346
End Property347

348
Public Property Let ProgramDate(ByVal varDateIn)349
If IsDate(varDateIn) Then350
internal_ProgramDate = varDateIn351
End If352
End Property353

354
Public ProgramTitle355

356
End Class357
%>358
这样就可以在任何ASP中调用我们定义的类了,语法如下:359
<!-- #include virtual="TVProgramClass.asp" -->360
<%361
Dim objTVShow362
Set objTVShow = New TVProgram363

364
objTVShow.StartTime = CDate("17:30")365
objTVShow.ProgramDate = DateSerial(1999,9,17)366
objTVShow.ProgramTitle = "The Jerry Springer Show"367

368
%> 369
<%= objTVShow.ProgramTitle %> is on at <%= objTVShow.StartTime %> on <%= objTVShow.ProgramDate %>.370
这里有一个建议。如果你重命名你的包含文件.asp,并保证所有重要代码都在<CODE><%
%>< CODE>中,那么就算有人猜到了你包含文件的文件名,也没办法看见里面的内容!371

372
评论:373
VBScript类在封装的层面上,还是有不少好处的,增加了代码的可读性与可维护性以及清晰度,但是,没有继承和重载等特性,并不是真正意义上的OOP。没有集合,但是据说可以用Scripting.Dictionary,据说更好用、更快。不过,感觉总是鸡类(肋)。