午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

深入VBS類與對象

 quasiceo 2013-11-21

深入VBS類與對象

VBS也可以編寫類:

1.VBS的類有兩種事件:

(1)Initialize 事件,在創(chuàng)建類的實例時發(fā)生(新建)此事件。

Private Sub Class_Initialize()
    statements
End Sub

當(dāng)類初始化時,statements部分由零個或多個將要運行的代碼語句組成。

(2)Terminate 事件,在所關(guān)聯(lián)的類的實例終止(銷毀)時發(fā)生此事件。

Private Sub Class_Terminate()
    statements
End Sub

當(dāng)類初始化時,statements 部分由零個或多個將要運行的代碼語句組成。

下面是類事件的例子:

  1. Class TestClass
  2.   Private Sub Class_Initialize   ' 設(shè)置 Initialize 事件。
  3.     MsgBox("TestClass started")
  4.   End Sub
  5.   Private Sub Class_Terminate   ' 設(shè)置 Terminate 事件。
  6.     MsgBox("TestClass terminated")
  7.   End Sub
  8. End Class

  9. Set X = New TestClass   ' 創(chuàng)建一個 TestClass 實例。
  10. Set X = Nothing      ' 刪除實例。
復(fù)制代碼
摘要:
a.類的事件方法格式是固定的,事件名是固定的,事件只能是Sub不能是Function,事件無參數(shù);
b.類實例通過New來創(chuàng)建,通過Nothing來銷毀;
c.記住所有的類實例都是對象,創(chuàng)建與銷毀時記得用Set語句,沒有Set是錯的
d.這兩個事件都不是必須的,即編寫類時可以不提供這兩個事件的實現(xiàn)代碼;
e.這兩個事件作用比較大,可以在這兩個事件中初始化對象以及銷毀對象時做一些其他的工作
f.因為VBS的兩個類事件都不接受參數(shù),所以不能在用New創(chuàng)建對象時初始化對象,可以另外設(shè)置一個公有的過程來完成這個任務(wù)

2.類可以有公有和私有字段:
(1)公有的字段可以外部訪問,私有的不能:
(2)可以定義數(shù)組字段,且此數(shù)組字段可以是動態(tài)數(shù)組

3.類可以有公有或者私有的屬性:
(1)公有的屬性可以外部調(diào)用,私有的屬性不能
(2)用Property Get定義讀屬性,用Property Set和Property Let來定義寫屬性
(3)當(dāng)定義寫屬性時,如果此屬性封裝的是對象字段,則此寫屬性必須是Property Set
(4)屬性不必是成對出現(xiàn),這樣就可以造成只讀或只寫屬性,當(dāng)然Private任意一方也可以造成這種情況

4.類可以有公有和私有的方法:
(1)公有的方法可以外部調(diào)用,私有的方法不能
  1. Class Circle
  2.             Public r
  3.        
  4.             Private mArea
  5.        
  6.             Public Sub Init(a)
  7.                         r=a
  8.             End Sub

  9.             Public Function Area()
  10.                         If mArea="" Then mArea=Atn(1)*4*r*r
  11.                         Area=mArea
  12.             End Function
  13.        
  14.             Private Sub EchoInfo()
  15.                         MsgBox "圓的半徑是:" & r & vbCrLf & "圓的面積是:" & mArea
  16.             End Sub
  17.        
  18. End Class

  19. Set c = New Circle   ' 創(chuàng)建一個 TestClass 實例。
  20. c.Init 2                               
  21. 'Init是在Python中的構(gòu)造函數(shù)名稱,你可以定義其他的名稱,隨你喜歡
  22. '其他語言,如C#,C++都是用類名做為構(gòu)造函數(shù)名稱,顯然沒有Init簡單易記
  23. MsgBox c.r
  24. MsgBox c.Area()
  25. 'MsgBox c.mArea                       
  26. '無法訪問,因為這個字段是私有的,只能類內(nèi)部訪問,如上面的Area方法
  27. 'MsgBox c.EchoInfo()       
  28. '無法訪問,因為這個方法是私有的,只能類內(nèi)部訪問

  29. Set c = Nothing      ' 刪除實例
復(fù)制代碼
下面是與屬性相關(guān)的例子:
  1. Class Student
  2.         Private mAge,mName,mNumber,mSex,mLover,mYear,mRank
  3.         '這里字段最好都定義為私有的,這樣可以更強的控制字段的讀寫
  4.         '并可以在讀寫時提供一些其他的計算處理
  5.         '這里我們假設(shè)Lover(情侶)也是一個學(xué)生,那么此字段就是一個
  6.         '對象類型的字段,請留意它的屬性是怎么實現(xiàn)的
  7.         Dim Belief   '人生信條,這里不指定其可訪問性
  8.         Sub Init(namestr,sexstr,ageint,rankint)
  9.                 If mName="" Then '這個判斷可以確保實例只被初始化一次
  10.                         mName=namestr
  11.                         mSex=sexstr
  12.                         mAge=ageint
  13.                         mRank=rankint
  14.                         Randomize
  15.                         mNumber=Int(Rnd*10000+1)
  16.                         mYear=Year(Date)
  17.                         '這里沒有提供mLover字段的初始化,畢竟一見鐘情太少
  18.                 Else
  19.                         MsgBox "No,you can't initialize a instance twice"
  20.                 End If
  21.         End Sub
  22.        
  23.         Property Get Rank()
  24.                 Rank=mRank
  25.         End Property
  26.        
  27.         Property Let Rank(value)
  28.                 mRank=value
  29.         End Property
  30.         '這里的寫屬性只能是Property Let,不能是Property Set,因為在外部要賦值給屬性的是一個int型的
  31.         '是值類型,不是對象類型(常說的引用類型)所以不能用Set,外部賦值時也不能用Set語句
  32.        
  33.         Property Get Age()
  34.                 If mYear<Year(Date) Then
  35.                         mYear=Year(Date)
  36.                         mAge=mAge+1
  37.                 End If
  38.                 age=mAge
  39.         End Property
  40.         'Age一經(jīng)設(shè)置只會隨著年份增加而改變,畢竟人們生活于同一個時空
  41.        
  42.         Public Default Property Get Name()
  43.                 Name=mName
  44.         End Property
  45.         '學(xué)生姓名默認(rèn)是不能更改,當(dāng)然你也可以改名字,建議在類中定義
  46.         '保守的改名方法
  47.         '這里定義Name為默認(rèn)屬性,注意使用Default關(guān)鍵字定義默認(rèn)屬性時,必須有Public關(guān)鍵字
  48.        
  49.         Property Get Sex()
  50.                 Sex=mSex
  51.         End Property
  52.         '學(xué)生性別當(dāng)然,一經(jīng)初始化,不會更改,除非蛋疼得跑去變性
  53.        
  54.         Property Get Lover()
  55.                 Set Lover=mLover
  56.         End Property
  57.        
  58.         Property Set Lover(value)
  59.                 Set mLover=value
  60.         End Property
  61.         '有Set屬性,此子(女)真風(fēng)流,如果你專情,不妨Private它
  62.         '這里寫成Property Let也是可以的,不過后面Set stu1.Lover=stu2要把Set去掉
  63.         '由此例可以看出Property Let和Property Get定義的屬性內(nèi)部定義都一樣的Set語句,但是在外部
  64.         '時,如果上面這里定義的是Let屬性那么不能用Set語句來賦值,雖然賦值給Lover屬性的是一個
  65.         '引用類型(即對象類型),如果上面這里是定義的是Set屬性,則必須Set語句
  66.        
  67.         '由以上Lover和Rank兩個屬性知,我們可以得出這樣的結(jié)論:
  68.         '(1)無論是對引用類型字段的封裝,還是對值類型字段的封裝,都可以用Property Let,而Set
  69.         '只能在對引用類型字段封裝時出現(xiàn)
  70.         '(2)定義類時我們可以根據(jù)外部賦值到屬性的類型來決定用Set還是用Let,而后定義好了之后,再由
  71.         '定義的是Property Let還是Property Set來決定賦值方式,即用不用Set語句
  72.        
  73.         Function Info()
  74.                 Info="學(xué)生信息:" & vbCrLf & _
  75.                                 "學(xué)號:" & mNumber & vbCrLf & _
  76.                                 "姓名:" & mName & vbCrLf & _
  77.                                 "性別:" & mSex & vbCrLf & _
  78.                                 "年齡:" & Age & vbCrLf & _
  79.                                 "排名:" & mRank & vbcrlf & _
  80.                                 "情侶:" & mLover
  81.         End Function
  82.         '這之中Age通過屬性來獲取以確保每次獲取的是正確的年齡
  83.         '沒有定義Age的寫屬性,這樣就保護了字段,避免非法改寫
  84.         '外部只能通過Age的讀屬性來訪問,所以確保了外部讀取年齡的正確性
  85.         '對mLover.Name可以直接用mLover來輸出,因為它的Name屬性是默認(rèn)屬性
  86. End Class

  87. Dim stu1,stu2                                      
  88. '最好定義變量,這樣可以防止全局變量對自定義函數(shù)的影響
  89. Set stu1=New Student
  90. Set stu2=New Student
  91. stu1.Init "Jobs","BigBoy",23,13       
  92. 'stu1.Age=32              
  93. '這里運行會報錯,因為沒有定義Age的寫屬性,外部無法通過賦值修改年齡
  94. stu2.Init "Joliy","Girl",21,10
  95. Set stu1.Lover=stu2
  96. MsgBox stu1.Info     '可訪問,說明方法隱式為Public
  97. stu1.Rank=8            '可訪問,說明屬性隱式為Public
  98. stu1.Belief="No pains,no gains"
  99. MsgBox stu1.Belief    '可訪問,說明字段隱式為Public
  100. MsgBox "使用默認(rèn)屬性:" & vbcrlf & stu1 & vbcrlf & stu2
  101. Set stu1=Nothing
  102. Set stu2=Nothing
復(fù)制代碼

摘要:
1.使用Default關(guān)鍵字定義默認(rèn)屬性時,必須顯式指定屬性為Public,雖然隱含的屬性就是Public
2.在對象構(gòu)造函數(shù)中設(shè)置條件,以確保初始化只能進行一次
3.(1)無論是對引用類型字段的封裝,還是對值類型字段的封裝,都可以用Property Let,而Property Set
   只能在對引用類型字段封裝時出現(xiàn),而且這種情況下依然可以不用Property Set
   (2)定義類時我們可以根據(jù)外部賦值到屬性的類型來決定用Set還是用Let,因為如果要賦值
   給屬性的值的類型是值類型,那么無論如何也用不著Property Set;而后定義好了之后,可以再由
   定義的是Property Let還是Property Set來決定賦值方式,即用不用Set語句
4.關(guān)于類中元素的可訪問性:
   (1)屬性不作說明時被認(rèn)為是Public的,但定義Default時必須顯式指定Public
   (2)方法與字段在不顯式指定其可訪問性時,被認(rèn)為是Public的
   (3)由下面這個例子知,類僅有的兩個事件也可以不指定可訪問性,隱式也被認(rèn)為是Public,可以外調(diào)
  1. Class TestClass
  2.   Sub Class_Initialize   ' 設(shè)置 Initialize 事件。
  3.     MsgBox("TestClass started")
  4.   End Sub
  5.   Sub Class_Terminate   ' 設(shè)置 Terminate 事件。
  6.     MsgBox("TestClass terminated")
  7.   End Sub
  8. End Class

  9. Set X = New TestClass   ' 創(chuàng)建一個 TestClass 實例。
  10. x.Class_Initialize         '可正常運行
  11. Set X = Nothing      ' 刪除實例。

注意:上面的例子中,即使把最后一句去掉,Class_Terminate事件仍然會發(fā)生,它會在腳本終止前被解釋器觸發(fā)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多