在VBScript中使用类

  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,据说更好用、更快。不过,感觉总是鸡类(肋)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值