深入VBS类与对象 (转)长文慎入

上一篇 / 下一篇  2015-02-07 23:45:47 / 个人分类:VBScript

(S(WxdG_CtCs0最近写系统的自动化脚本,封装了QTP的一些操作,对于类与对象,其实对于编写自动化脚本还是很有用处的,比如可以把同类操作放在一个类里,通过创建该类的实例来调用具体方法51Testing软件测试网u]Xc#I,H
class test51Testing软件测试网*h!gm~S6f
  private intid '只能类里面用,外部无法访问
'N"|4Vm Zs"z5vj0  public strname
cn~i'DN}0  Public Default Property Get Name()  
'\ oL`1@"m;S:} e%s"x0    Name=strname
,u!{@#eYK:H A(y'?0  End Property51Testing软件测试网azmZx(ihc2U P4d?
end class51Testing软件测试网nC5c#vk~7|J,n

l)[5D%J-Q~0*default为默认方法或属性,必须同public一起使用51Testing软件测试网A#hP"r6Gx
*类里定义的function、sub为类的方法,变量为属性,默认都为public,如果为private,则外部无法访问51Testing软件测试网.FT NJz D
*Property get为获取属性值,Property let为设置属性值,Property set为设置属性为对象51Testing软件测试网I.J~BL_

51Testing软件测试网}I7K(Q#M*| J}

原文链接:http://www.cnblogs.com/hannover/archive/2012/05/22/2514038.html

F8E.ynKS5kU;[%o051Testing软件测试网%l(oe!}6ks2vt

VBS也可以编写类:
w'N b)Ll_L yt1E0
5d4E9@\2v01.VBS的类有两种事件:
r\h$qWn0
v/^*H^M \*{0(1)Initialize 事件,在创建类的实例时发生(新建)此事件。
uX;mtl&BcP0
Kmq1[?+C0Private Sub Class_Initialize()
X!v` V%{N5Z(U0   statements51Testing软件测试网,d6]vq0`
End Sub
3}8{EIh~y3? P0
"?tq+z!p-X0当类初始化时,statements部分由零个或多个将要运行的代码语句组成。51Testing软件测试网.Hc"s4N9Hz2n7N
51Testing软件测试网:^0_M/R Rs PX m
(2)Terminate 事件,在所关联的类的实例终止(销毁)时发生此事件。
&TN)Uar051Testing软件测试网j&d8W#F3x~.m0k,z
Private Sub Class_Terminate()51Testing软件测试网 `#S"`8g!V `v
   statements
Se(`6M{S0b)Y"E+u0End Sub
hr9D+v,Wt$B0
/{6t6S&lrc U!^~0当类初始化时,statements部分由零个或多个将要运行的代码语句组成。51Testing软件测试网7Wn.|3uUz(H
51Testing软件测试网@3A$E9hv2Uj0Y1I
下面是类事件的例子:
(} uUwD Wl0
%n-`{g|#E'_0

(`5p"x]Y/nEI }/\0
  1. Class TestClass51Testing软件测试网D)x@3d XC
  2.   Private Sub Class_Initialize   ' 设置 Initialize 事件。51Testing软件测试网 K'm3O'S#rb
  3.     MsgBox("TestClass started")
    HX,es Yh.moY F0
  4.   End Sub51Testing软件测试网/se8A/W#x4yJ
  5.   Private Sub Class_Terminate   ' 设置 Terminate 事件。
    b$G Y9Qd.~+l0
  6.     MsgBox("TestClass terminated")51Testing软件测试网eF~r#i`,R)w0H.S
  7.   End Sub51Testing软件测试网V.ht#O9})n*}Yo7D9k
  8. End Class
    w7bJ;@-V0vcal*A0
  9. 51Testing软件测试网Dj(Vdn&l4ggK
  10. Set X = New TestClass   ' 创建一个 TestClass 实例。51Testing软件测试网$?~i w4P3|lL7gbh6^
  11. Set X = Nothing      ' 删除实例。
复制代码
摘要:51Testing软件测试网 Gn'Z/oK0b+AOV
a.类的事件方法格式是固定的,事件名是固定的,事件只能是Sub不能是Function,事件无参数;51Testing软件测试网x.xW5b s A},dx
b.类实例通过New来创建,通过Nothing来销毁;
} O4Al,]y3L!g0c.记住所有的类实例都是对象,创建与销毁时记得用Set语句,没有Set是错的51Testing软件测试网]2pt%M)Ce
d.这两个事件都不是必须的,即编写类时可以不提供这两个事件的实现代码;51Testing软件测试网K%f7@]^S/H;L
e.这两个事件作用比较大,可以在这两个事件中初始化对象以及销毁对象时做一些其他的工作51Testing软件测试网4R5O q Y%r
f.因为VBS的两个类事件都不接受参数,所以不能在用New创建对象时初始化对象,可以另外设置一个公有的过程来完成这个任务
w![3i*^!m ^d051Testing软件测试网/azkO*F
2.类可以有公有和私有字段:
0P;f)c+iI"^0(1)公有的字段可以外部访问,私有的不能:51Testing软件测试网l|oT1IO3x
(2)可以定义数组字段,且此数组字段可以是动态数组
6WuZ3Q*LD0
LATIom;?03.类可以有公有或者私有的属性:
_3b XY V0(1)公有的属性可以外部调用,私有的属性不能51Testing软件测试网FJK/t"l1K
(2)用Property Get定义读属性,用Property Set和Property Let来定义写属性51Testing软件测试网Xz?x3gql2N
(3)当定义写属性时,如果此属性封装的是对象字段,则此写属性必须是Property Set51Testing软件测试网"~1G+^G4^c x
(4)属性不必是成对出现,这样就可以造成只读或只写属性,当然Private任意一方也可以造成这种情况51Testing软件测试网Q5L%y3^-K gm
51Testing软件测试网%A8iS&W4i/^!H
4.类可以有公有和私有的方法:
-mmn7B#\.] @0(1)公有的方法可以外部调用,私有的方法不能
/q3g4_G,~8`.?0
  1. Class Circle51Testing软件测试网| G+p5r O%vL"I
  2.             Public r51Testing软件测试网1[?lWO sff%F
  3.        51Testing软件测试网E'l1xM]%O
  4.             Private mArea
    5FW1]W0mQ0
  5.        51Testing软件测试网;s?#c;Kl2r
  6.             Public Sub Init(a)51Testing软件测试网 \&M._;m q;k? [)E H
  7.                         r=a
    /lZ"qJD!l0
  8.             End Sub51Testing软件测试网 {0a*mbE#B&C-i
  9. 51Testing软件测试网 nC.Dd$Y
  10.             Public Function Area()51Testing软件测试网1n1pL(b1^H tG&{
  11.                         If mArea="" Then mArea=Atn(1)*4*r*r
    C#S*NV+J.M0
  12.                         Area=mArea51Testing软件测试网2S0| jA3hg"Z,[
  13.             End Function
    +{ jW @cs0
  14.        51Testing软件测试网3x cv;BRx+|
  15.             Private Sub EchoInfo()
    W+v6{ud v#YB3?0
  16.                         MsgBox "圆的半径是:" & r & vbCrLf & "圆的面积是:" & mArea51Testing软件测试网PZ hK%S9yxB
  17.             End Sub51Testing软件测试网4w.^5])R6\{L4i
  18.        
    in*_-DI-_.c0
  19. End Class
    ,fK&Qd8ms]Z3A0

  20. +UD x#vY8bU$w|0
  21. Set c = New Circle   ' 创建一个 TestClass 实例。51Testing软件测试网$M2OK"h;_@]pQ1?(g,Jv
  22. c.Init 2                               51Testing软件测试网m.w/r q+a F5J+v3Uo
  23. 'Init是在Python中的构造函数名称,你可以定义其他的名称,随你喜欢51Testing软件测试网l+oz)Q/Y)L Dn1n
  24. '其他语言,如C#,C++都是用类名做为构造函数名称,显然没有Init简单易记51Testing软件测试网$L6u-[L*tz'Xo
  25. MsgBox c.r51Testing软件测试网.?jC,Pb&s0fH;D
  26. MsgBox c.Area()
    3?K^&o0[!m-V0
  27. 'MsgBox c.mArea                       51Testing软件测试网(f&e` @^
  28. '无法访问,因为这个字段是私有的,只能类内部访问,如上面的Area方法51Testing软件测试网'[/|P\;C9N
  29. 'MsgBox c.EchoInfo()       
    -Oz0AJ V:vWj0
  30. '无法访问,因为这个方法是私有的,只能类内部访问
    7M s `7|[I0
  31. 51Testing软件测试网n Fh3Q\
  32. Set c = Nothing      ' 删除实例
复制代码
下面是与属性相关的例子:51Testing软件测试网1P@ pU&B @2vOwr
  1. Class Student51Testing软件测试网D%S J4UC+aR
  2.         Private mAge,mName,mNumber,mSex,mLover,mYear,mRank51Testing软件测试网Y1mgMG)f
  3.         '这里字段最好都定义为私有的,这样可以更强的控制字段的读写
    1V N&aQ*f {D0
  4.         '并可以在读写时提供一些其他的计算处理
    3a9Nu/_ gg x:oV0
  5.         '这里我们假设Lover(情侣)也是一个学生,那么此字段就是一个
    g~7Ett;j!W0
  6.         '对象类型的字段,请留意它的属性是怎么实现的
    2UF8xn(dA,f2\G t0^0
  7.         Dim Belief   '人生信条,这里不指定其可访问性
    K?-Ah:p2ME}6c0
  8.         Sub Init(namestr,sexstr,ageint,rankint)
    (} vv!Y#w8w%p9D5[5m0
  9.                 If mName="" Then '这个判断可以确保实例只被初始化一次51Testing软件测试网Uh3R}&C
  10.                         mName=namestr
    0l1I]O['h|0
  11.                         mSex=sexstr51Testing软件测试网;G7ox'W9E)T
  12.                         mAge=ageint51Testing软件测试网3w q&i&fs
  13.                         mRank=rankint
    4S/b,FC-d&P3@,aA$z0
  14.                         Randomize51Testing软件测试网jaUz'D m&um
  15.                         mNumber=Int(Rnd*10000+1)
    &m'\"gW5~*n4h0
  16.                         mYear=Year(Date)
    ;kz j t:F2m3Uq0
  17.                         '这里没有提供mLover字段的初始化,毕竟一见钟情太少
    #E*KC~6h6@ ^0
  18.                 Else
    @ V.Y1O tP8l0
  19.                         MsgBox "No,you can't initialize a instance twice"
    ,u1N0[Tk A-cD0
  20.                 End If
    f3r6M rz"Wt0
  21.         End Sub51Testing软件测试网"F)l'N!gl)tuP.J \
  22.        51Testing软件测试网iVh)Y](f
  23.         Property Get Rank()51Testing软件测试网9h8Sj/V&}P'J5z[n)ml&O
  24.                 Rank=mRank51Testing软件测试网g3BrJ*_q!\}
  25.         End Property51Testing软件测试网zm2^2Wy!v
  26.        
    S.L%}3A[,}2z)o0
  27.         Property Let Rank(value)
    3|t.C6\'O2D'bP0
  28.                 mRank=value51Testing软件测试网4IZCN)DE8OV_!w!h
  29.         End Property51Testing软件测试网&HO\%\@-}}
  30.         '这里的写属性只能是Property Let,不能是Property Set,因为在外部要赋值给属性的是一个int型的
    5E/Y0W(zN/Fp8T0
  31.         '是值类型,不是对象类型(常说的引用类型)所以不能用Set,外部赋值时也不能用Set语句51Testing软件测试网n4w"EjcVI\\j
  32.        
    H!G4ga1y%{nS0
  33.         Property Get Age()
    fY\Sc e0
  34.                 If mYear<Year(Date) Then
    TI o B`:]r0
  35.                         mYear=Year(Date)51Testing软件测试网/\ ?7ycZTC,C
  36.                         mAge=mAge+1
    P]QU~(o{e0
  37.                 End If
    +vg.d9`[0
  38.                 age=mAge51Testing软件测试网 c R%l+cj
  39.         End Property
    8GCC;T2u"E1Z'F7|0
  40.         'Age一经设置只会随着年份增加而改变,毕竟人们生活于同一个时空51Testing软件测试网aZK4e p8rQx
  41.        51Testing软件测试网yhf/`4|j AC;dTS
  42.         Public Default Property Get Name()
    :W&{4WN#Xw,{_0
  43.                 Name=mName
    \v h EI/w^ mA"v0
  44.         End Property51Testing软件测试网,CS"`m`}D`
  45.         '学生姓名默认是不能更改,当然你也可以改名字,建议在类中定义51Testing软件测试网,R%G%fFZ
  46.         '保守的改名方法51Testing软件测试网B%GV$MC
  47.         '这里定义Name为默认属性,注意使用Default关键字定义默认属性时,必须有Public关键字51Testing软件测试网%O)H@+B5W"k ci
  48.        
    4e+~)xU0V^ [5Mv0
  49.         Property Get Sex()51Testing软件测试网}9jh Hd` vB%\M8B
  50.                 Sex=mSex51Testing软件测试网.Q[.I e.n
  51.         End Property51Testing软件测试网l!d*sc6@{
  52.         '学生性别当然,一经初始化,不会更改,除非蛋疼得跑去变性51Testing软件测试网%at o9q_ b$U-~
  53.        
    vav.}@Rn0
  54.         Property Get Lover()
    f!J"DV2Lv j^0
  55.                 Set Lover=mLover51Testing软件测试网z+A A-F\
  56.         End Property51Testing软件测试网zti)a`~;i
  57.        
    HI@jf `0
  58.         Property Set Lover(value)51Testing软件测试网3s0r.Mim/]
  59.                 Set mLover=value
    !e)JPlv }{m?7z0
  60.         End Property
    p;if5XL)]0
  61.         '有Set属性,此子(女)真风流,如果你专情,不妨Private它
    *~A*JY)S$T I/k[q,z0
  62.         '这里写成Property Let也是可以的,不过后面Set stu1.Lover=stu2要把Set去掉
    "u4BD*P(e5T$w0
  63.         '由此例可以看出Property Let和Property Get定义的属性内部定义都一样的Set语句,但是在外部
    ;O*l Q V)i E2A#o0
  64.         '时,如果上面这里定义的是Let属性那么不能用Set语句来赋值,虽然赋值给Lover属性的是一个51Testing软件测试网;r)po/AuB$d a;Va5E
  65.         '引用类型(即对象类型),如果上面这里是定义的是Set属性,则必须Set语句
    ,}5\*@B9C-c0
  66.        
    x+Eq~a#u5E1c0
  67.         '由以上Lover和Rank两个属性知,我们可以得出这样的结论:51Testing软件测试网+f(fTVm8bl
  68.         '(1)无论是对引用类型字段的封装,还是对值类型字段的封装,都可以用Property Let,而Set51Testing软件测试网 [c ]%l Q(_
  69.         '只能在对引用类型字段封装时出现
    X a%Cl$n0
  70.         '(2)定义类时我们可以根据外部赋值到属性的类型来决定用Set还是用Let,而后定义好了之后,再由51Testing软件测试网G}(F(U@!A
  71.         '定义的是Property Let还是Property Set来决定赋值方式,即用不用Set语句
    ~V,di9Sv6J3y0
  72.        51Testing软件测试网S!_:v\1BP:Iu
  73.         Function Info()51Testing软件测试网h0z9i2M2AJ+gQ4~
  74.                 Info="学生信息:" & vbCrLf & _51Testing软件测试网9E;P%v;M'R/J ^
  75.                                 "学号:" & mNumber & vbCrLf & _51Testing软件测试网G/lfA#aB
  76.                                 "姓名:" & mName & vbCrLf & _51Testing软件测试网8On"z ]9ID1HV
  77.                                 "性别:" & mSex & vbCrLf & _51Testing软件测试网 ^!a/`,D { \$v:u3t\
  78.                                 "年龄:" & Age & vbCrLf & _
    n BDl\M0
  79.                                 "排名:" & mRank & vbcrlf & _
    U(j3g7B n0
  80.                                 "情侣:" & mLover
    )r-F6|:yS(K-k4s0
  81.         End Function
    g8{1@ @3q@ l0
  82.         '这之中Age通过属性来获取以确保每次获取的是正确的年龄51Testing软件测试网9Y*`m `/`}
  83.         '没有定义Age的写属性,这样就保护了字段,避免非法改写
    &E9GnL@ BOa#i0
  84.         '外部只能通过Age的读属性来访问,所以确保了外部读取年龄的正确性51Testing软件测试网`5H)ti8c1BV
  85.         '对mLover.Name可以直接用mLover来输出,因为它的Name属性是默认属性
    x#^9z-nO@#g-M'xc0
  86. End Class51Testing软件测试网_-L m.n:x#f-g3IL p

  87. s_9u9L? Zh0
  88. Dim stu1,stu2                                      51Testing软件测试网(r/{:f&L|\R
  89. '最好定义变量,这样可以防止全局变量对自定义函数的影响51Testing软件测试网/q5^%HL lLt
  90. Set stu1=New Student51Testing软件测试网z&h7Z-G ??]oH7~
  91. Set stu2=New Student
    .Nj5a7tTfh!`j0
  92. stu1.Init "Jobs","BigBoy",23,13       
    6{?k X*\ t0
  93. 'stu1.Age=32              
    3_VA6O:q5G9G0
  94. '这里运行会报错,因为没有定义Age的写属性,外部无法通过赋值修改年龄
    M G5sOmaEt/e0
  95. stu2.Init "Joliy","Girl",21,1051Testing软件测试网ydYkZ:W+@
  96. Set stu1.Lover=stu2
    8dXp&[,dH0
  97. MsgBox stu1.Info     '可访问,说明方法隐式为Public
    b GY;yr-@4a0
  98. stu1.Rank=8            '可访问,说明属性隐式为Public
    !C~d'P2WW*X0
  99. stu1.Belief="No pains,no gains"
    Yc:BLRQf0
  100. MsgBox stu1.Belief    '可访问,说明字段隐式为Public
    U8f3DFBItWh1K2yZ0
  101. MsgBox "使用默认属性:" & vbcrlf & stu1 & vbcrlf & stu251Testing软件测试网3W u6Xp%ViU XW
  102. Set stu1=Nothing
    *JE I8Ws @O&u_0
  103. Set stu2=Nothing
复制代码
51Testing软件测试网%iRR)pI"AvU+C
摘要:51Testing软件测试网V2O q8? A
1.使用Default关键字定义默认属性时,必须显式指定属性为Public,虽然隐含的属性就是Public51Testing软件测试网(ip\{cH
2.在对象构造函数中设置条件,以确保初始化只能进行一次51Testing软件测试网(VY(`0^%R
3.(1)无论是对引用类型字段的封装,还是对值类型字段的封装,都可以用Property Let,而Property Set
QQY$Hx*d0   只能在对引用类型字段封装时出现,而且这种情况下依然可以不用Property Set51Testing软件测试网f-Bay-p7OJ'^ z*V
   (2)定义类时我们可以根据外部赋值到属性的类型来决定用Set还是用Let,因为如果要赋值51Testing软件测试网#wUF)K/oC_^
   给属性的值的类型是值类型,那么无论如何也用不着Property Set;而后定义好了之后,可以再由
S3Y"T}bAg"s2I0   定义的是Property Let还是Property Set来决定赋值方式,即用不用Set语句
5Wi4L&k!o6T;}04.关于类中元素的可访问性:51Testing软件测试网5V7x#R W8X*Yw_*D n%V,y
   (1)属性不作说明时被认为是Public的,但定义Default时必须显式指定Public51Testing软件测试网M\ oA,z/rx
   (2)方法与字段在不显式指定其可访问性时,被认为是Public的51Testing软件测试网i(Y\.VrG
   (3)由下面这个例子知,类仅有的两个事件也可以不指定可访问性,隐式也被认为是Public,可以外调51Testing软件测试网;P3NEsG
  1. Class TestClass51Testing软件测试网$q$H rg G
  2.   Sub Class_Initialize   ' 设置 Initialize 事件。
    wI;\UQFi8H)CA0
  3.     MsgBox("TestClass started")
    H#p s#cx:o$n Z"~,l0
  4.   End Sub51Testing软件测试网J`9rbUad^ M
  5.   Sub Class_Terminate   ' 设置 Terminate 事件。51Testing软件测试网 K4}*aX&|;sWO
  6.     MsgBox("TestClass terminated")51Testing软件测试网v6] F'?"M
  7.   End Sub51Testing软件测试网 L F0AU I;i(L3[ n
  8. End Class
    /@g*FZ0di[0
  9. 51Testing软件测试网!C$M1|J c*f]o
  10. Set X = New TestClass   ' 创建一个 TestClass 实例。51Testing软件测试网1E*l"?!|'Sv3c*H]
  11. x.Class_Initialize         '可正常运行51Testing软件测试网XAII @a
  12. Set X = Nothing      ' 删除实例

TAG:

superroshan的个人空间 引用 删除 superroshan   /   2015-02-12 14:29:03
学习qtp需要学习的语言
superroshan的个人空间 引用 删除 superroshan   /   2015-02-12 14:28:26
1
 

评分:0

我来说两句

Open Toolbar