深入VBS類與對象


VBS也可以編寫類:

1.VBS的類有兩種事件:

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

Private Sub Class_Initialize()
    statements
End Sub

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

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

Private Sub Class_Terminate()
    statements
End Sub

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

下面是類事件的例子:

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

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

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

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

4.類可以有公有和私有的方法:
(1)公有的方法可以外部調用,私有的方法不能
  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   ' 創建一個 TestClass 實例。
  20. c.Init 2                               
  21. 'Init是在Python中的構造函數名稱,你可以定義其他的名稱,隨你喜歡
  22. '其他語言,如C#,C++都是用類名做為構造函數名稱,顯然沒有Init簡單易記
  23. MsgBox c.r
  24. MsgBox c.Area()
  25. 'MsgBox c.mArea                       
  26. '無法訪問,因為這個字段是私有的,只能類內部訪問,如上面的Area方法
  27. 'MsgBox c.EchoInfo()       
  28. '無法訪問,因為這個方法是私有的,只能類內部訪問

  29. Set c = Nothing      ' 刪除實例
復制代碼
下面是與屬性相關的例子:
  1. Class Student
  2.         Private mAge,mName,mNumber,mSex,mLover,mYear,mRank
  3.         '這里字段最好都定義為私有的,這樣可以更強的控制字段的讀寫
  4.         '並可以在讀寫時提供一些其他的計算處理
  5.         '這里我們假設Lover(情侶)也是一個學生,那么此字段就是一個
  6.         '對象類型的字段,請留意它的屬性是怎么實現的
  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一經設置只會隨着年份增加而改變,畢竟人們生活於同一個時空
  41.        
  42.         Public Default Property Get Name()
  43.                 Name=mName
  44.         End Property
  45.         '學生姓名默認是不能更改,當然你也可以改名字,建議在類中定義
  46.         '保守的改名方法
  47.         '這里定義Name為默認屬性,注意使用Default關鍵字定義默認屬性時,必須有Public關鍵字
  48.        
  49.         Property Get Sex()
  50.                 Sex=mSex
  51.         End Property
  52.         '學生性別當然,一經初始化,不會更改,除非蛋疼得跑去變性
  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屬性,此子(女)真風流,如果你專情,不妨Private它
  62.         '這里寫成Property Let也是可以的,不過后面Set stu1.Lover=stu2要把Set去掉
  63.         '由此例可以看出Property Let和Property Get定義的屬性內部定義都一樣的Set語句,但是在外部
  64.         '時,如果上面這里定義的是Let屬性那么不能用Set語句來賦值,雖然賦值給Lover屬性的是一個
  65.         '引用類型(即對象類型),如果上面這里是定義的是Set屬性,則必須Set語句
  66.        
  67.         '由以上Lover和Rank兩個屬性知,我們可以得出這樣的結論:
  68.         '(1)無論是對引用類型字段的封裝,還是對值類型字段的封裝,都可以用Property Let,而Set
  69.         '只能在對引用類型字段封裝時出現
  70.         '(2)定義類時我們可以根據外部賦值到屬性的類型來決定用Set還是用Let,而后定義好了之后,再由
  71.         '定義的是Property Let還是Property Set來決定賦值方式,即用不用Set語句
  72.        
  73.         Function Info()
  74.                 Info="學生信息:" & vbCrLf & _
  75.                                 "學號:" & 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屬性是默認屬性
  86. End Class

  87. Dim stu1,stu2                                      
  88. '最好定義變量,這樣可以防止全局變量對自定義函數的影響
  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 "使用默認屬性:" & vbcrlf & stu1 & vbcrlf & stu2
  101. Set stu1=Nothing
  102. Set stu2=Nothing
復制代碼

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM