1.VBS的類有兩種事件:
(1)Initialize 事件,在創建類的實例時發生(新建)此事件。
Private Sub Class_Initialize()
statements
End Sub
當類初始化時, statements部分由零個或多個將要運行的代碼語句組成。
(2)Terminate 事件,在所關聯的類的實例終止(銷毀)時發生此事件。
Private Sub Class_Terminate()
statements
End Sub
當類初始化時, statements 部分由零個或多個將要運行的代碼語句組成。
下面是類事件的例子:
- Class TestClass
- Private Sub Class_Initialize ' 設置 Initialize 事件。
- MsgBox("TestClass started")
- End Sub
- Private Sub Class_Terminate ' 設置 Terminate 事件。
- MsgBox("TestClass terminated")
- End Sub
- End Class
- Set X = New TestClass ' 創建一個 TestClass 實例。
- 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)公有的方法可以外部調用,私有的方法不能
- Class Circle
- Public r
-
- Private mArea
-
- Public Sub Init(a)
- r=a
- End Sub
- Public Function Area()
- If mArea="" Then mArea=Atn(1)*4*r*r
- Area=mArea
- End Function
-
- Private Sub EchoInfo()
- MsgBox "圓的半徑是:" & r & vbCrLf & "圓的面積是:" & mArea
- End Sub
-
- End Class
- Set c = New Circle ' 創建一個 TestClass 實例。
- c.Init 2
- 'Init是在Python中的構造函數名稱,你可以定義其他的名稱,隨你喜歡
- '其他語言,如C#,C++都是用類名做為構造函數名稱,顯然沒有Init簡單易記
- MsgBox c.r
- MsgBox c.Area()
- 'MsgBox c.mArea
- '無法訪問,因為這個字段是私有的,只能類內部訪問,如上面的Area方法
- 'MsgBox c.EchoInfo()
- '無法訪問,因為這個方法是私有的,只能類內部訪問
- Set c = Nothing ' 刪除實例
- Class Student
- Private mAge,mName,mNumber,mSex,mLover,mYear,mRank
- '這里字段最好都定義為私有的,這樣可以更強的控制字段的讀寫
- '並可以在讀寫時提供一些其他的計算處理
- '這里我們假設Lover(情侶)也是一個學生,那么此字段就是一個
- '對象類型的字段,請留意它的屬性是怎么實現的
- Dim Belief '人生信條,這里不指定其可訪問性
- Sub Init(namestr,sexstr,ageint,rankint)
- If mName="" Then '這個判斷可以確保實例只被初始化一次
- mName=namestr
- mSex=sexstr
- mAge=ageint
- mRank=rankint
- Randomize
- mNumber=Int(Rnd*10000+1)
- mYear=Year(Date)
- '這里沒有提供mLover字段的初始化,畢竟一見鍾情太少
- Else
- MsgBox "No,you can't initialize a instance twice"
- End If
- End Sub
-
- Property Get Rank()
- Rank=mRank
- End Property
-
- Property Let Rank(value)
- mRank=value
- End Property
- '這里的寫屬性只能是Property Let,不能是Property Set,因為在外部要賦值給屬性的是一個int型的
- '是值類型,不是對象類型(常說的引用類型)所以不能用Set,外部賦值時也不能用Set語句
-
- Property Get Age()
- If mYear<Year(Date) Then
- mYear=Year(Date)
- mAge=mAge+1
- End If
- age=mAge
- End Property
- 'Age一經設置只會隨着年份增加而改變,畢竟人們生活於同一個時空
-
- Public Default Property Get Name()
- Name=mName
- End Property
- '學生姓名默認是不能更改,當然你也可以改名字,建議在類中定義
- '保守的改名方法
- '這里定義Name為默認屬性,注意使用Default關鍵字定義默認屬性時,必須有Public關鍵字
-
- Property Get Sex()
- Sex=mSex
- End Property
- '學生性別當然,一經初始化,不會更改,除非蛋疼得跑去變性
-
- Property Get Lover()
- Set Lover=mLover
- End Property
-
- Property Set Lover(value)
- Set mLover=value
- End Property
- '有Set屬性,此子(女)真風流,如果你專情,不妨Private它
- '這里寫成Property Let也是可以的,不過后面Set stu1.Lover=stu2要把Set去掉
- '由此例可以看出Property Let和Property Get定義的屬性內部定義都一樣的Set語句,但是在外部
- '時,如果上面這里定義的是Let屬性那么不能用Set語句來賦值,雖然賦值給Lover屬性的是一個
- '引用類型(即對象類型),如果上面這里是定義的是Set屬性,則必須Set語句
-
- '由以上Lover和Rank兩個屬性知,我們可以得出這樣的結論:
- '(1)無論是對引用類型字段的封裝,還是對值類型字段的封裝,都可以用Property Let,而Set
- '只能在對引用類型字段封裝時出現
- '(2)定義類時我們可以根據外部賦值到屬性的類型來決定用Set還是用Let,而后定義好了之后,再由
- '定義的是Property Let還是Property Set來決定賦值方式,即用不用Set語句
-
- Function Info()
- Info="學生信息:" & vbCrLf & _
- "學號:" & mNumber & vbCrLf & _
- "姓名:" & mName & vbCrLf & _
- "性別:" & mSex & vbCrLf & _
- "年齡:" & Age & vbCrLf & _
- "排名:" & mRank & vbcrlf & _
- "情侶:" & mLover
- End Function
- '這之中Age通過屬性來獲取以確保每次獲取的是正確的年齡
- '沒有定義Age的寫屬性,這樣就保護了字段,避免非法改寫
- '外部只能通過Age的讀屬性來訪問,所以確保了外部讀取年齡的正確性
- '對mLover.Name可以直接用mLover來輸出,因為它的Name屬性是默認屬性
- End Class
- Dim stu1,stu2
- '最好定義變量,這樣可以防止全局變量對自定義函數的影響
- Set stu1=New Student
- Set stu2=New Student
- stu1.Init "Jobs","BigBoy",23,13
- 'stu1.Age=32
- '這里運行會報錯,因為沒有定義Age的寫屬性,外部無法通過賦值修改年齡
- stu2.Init "Joliy","Girl",21,10
- Set stu1.Lover=stu2
- MsgBox stu1.Info '可訪問,說明方法隱式為Public
- stu1.Rank=8 '可訪問,說明屬性隱式為Public
- stu1.Belief="No pains,no gains"
- MsgBox stu1.Belief '可訪問,說明字段隱式為Public
- MsgBox "使用默認屬性:" & vbcrlf & stu1 & vbcrlf & stu2
- Set stu1=Nothing
- 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,可以外調
- Class TestClass
- Sub Class_Initialize ' 設置 Initialize 事件。
- MsgBox("TestClass started")
- End Sub
- Sub Class_Terminate ' 設置 Terminate 事件。
- MsgBox("TestClass terminated")
- End Sub
- End Class
- Set X = New TestClass ' 創建一個 TestClass 實例。
- x.Class_Initialize '可正常運行
- Set X = Nothing ' 刪除實例。
注意:上面的例子中,即使把最后一句去掉,Class_Terminate事件仍然會發生,它會在腳本終止前被解釋器觸發。