在VBScript中使用类

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

转载于:https://www.cnblogs.com/Dicky/archive/2005/06/05/168469.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值