VBS也可以編寫類:
1.VBS的類有兩種事件:
(1)Initialize 事件,在創(chuàng)建類的實例時發(fā)生(新建)此事件。
Private Sub Class_Initialize()
statementsEnd Sub
當(dāng)類初始化時,
statements部分由零個或多個將要運行的代碼語句組成。
(2)Terminate 事件,在所關(guān)聯(lián)的類的實例終止(銷毀)時發(fā)生此事件。
Private Sub Class_Terminate()
statementsEnd Sub
當(dāng)類初始化時,
statements 部分由零個或多個將要運行的代碼語句組成。
下面是類事件的例子:
- Class TestClass
- Private Sub Class_Initialize ' 設(shè)置 Initialize 事件。
- MsgBox("TestClass started")
- End Sub
- Private Sub Class_Terminate ' 設(shè)置 Terminate 事件。
- MsgBox("TestClass terminated")
- End Sub
- End Class
- Set X = New TestClass ' 創(chuàng)建一個 TestClass 實例。
- 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)用,私有的方法不能
- 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 ' 創(chuàng)建一個 TestClass 實例。
- c.Init 2
- 'Init是在Python中的構(gòu)造函數(shù)名稱,你可以定義其他的名稱,隨你喜歡
- '其他語言,如C#,C++都是用類名做為構(gòu)造函數(shù)名稱,顯然沒有Init簡單易記
- MsgBox c.r
- MsgBox c.Area()
- 'MsgBox c.mArea
- '無法訪問,因為這個字段是私有的,只能類內(nèi)部訪問,如上面的Area方法
- 'MsgBox c.EchoInfo()
- '無法訪問,因為這個方法是私有的,只能類內(nèi)部訪問
- Set c = Nothing ' 刪除實例
復(fù)制代碼下面是與屬性相關(guān)的例子:
- Class Student
- Private mAge,mName,mNumber,mSex,mLover,mYear,mRank
- '這里字段最好都定義為私有的,這樣可以更強的控制字段的讀寫
- '并可以在讀寫時提供一些其他的計算處理
- '這里我們假設(shè)Lover(情侶)也是一個學(xué)生,那么此字段就是一個
- '對象類型的字段,請留意它的屬性是怎么實現(xiàn)的
- 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一經(jīng)設(shè)置只會隨著年份增加而改變,畢竟人們生活于同一個時空
-
- Public Default Property Get Name()
- Name=mName
- End Property
- '學(xué)生姓名默認(rèn)是不能更改,當(dāng)然你也可以改名字,建議在類中定義
- '保守的改名方法
- '這里定義Name為默認(rèn)屬性,注意使用Default關(guān)鍵字定義默認(rèn)屬性時,必須有Public關(guān)鍵字
-
- Property Get Sex()
- Sex=mSex
- End Property
- '學(xué)生性別當(dāng)然,一經(jīng)初始化,不會更改,除非蛋疼得跑去變性
-
- Property Get Lover()
- Set Lover=mLover
- End Property
-
- Property Set Lover(value)
- Set mLover=value
- End Property
- '有Set屬性,此子(女)真風(fēng)流,如果你專情,不妨Private它
- '這里寫成Property Let也是可以的,不過后面Set stu1.Lover=stu2要把Set去掉
- '由此例可以看出Property Let和Property Get定義的屬性內(nèi)部定義都一樣的Set語句,但是在外部
- '時,如果上面這里定義的是Let屬性那么不能用Set語句來賦值,雖然賦值給Lover屬性的是一個
- '引用類型(即對象類型),如果上面這里是定義的是Set屬性,則必須Set語句
-
- '由以上Lover和Rank兩個屬性知,我們可以得出這樣的結(jié)論:
- '(1)無論是對引用類型字段的封裝,還是對值類型字段的封裝,都可以用Property Let,而Set
- '只能在對引用類型字段封裝時出現(xiàn)
- '(2)定義類時我們可以根據(jù)外部賦值到屬性的類型來決定用Set還是用Let,而后定義好了之后,再由
- '定義的是Property Let還是Property Set來決定賦值方式,即用不用Set語句
-
- Function Info()
- Info="學(xué)生信息:" & vbCrLf & _
- "學(xué)號:" & mNumber & vbCrLf & _
- "姓名:" & mName & vbCrLf & _
- "性別:" & mSex & vbCrLf & _
- "年齡:" & Age & vbCrLf & _
- "排名:" & mRank & vbcrlf & _
- "情侶:" & mLover
- End Function
- '這之中Age通過屬性來獲取以確保每次獲取的是正確的年齡
- '沒有定義Age的寫屬性,這樣就保護了字段,避免非法改寫
- '外部只能通過Age的讀屬性來訪問,所以確保了外部讀取年齡的正確性
- '對mLover.Name可以直接用mLover來輸出,因為它的Name屬性是默認(rèn)屬性
- End Class
- Dim stu1,stu2
- '最好定義變量,這樣可以防止全局變量對自定義函數(shù)的影響
- 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 "使用默認(rèn)屬性:" & vbcrlf & stu1 & vbcrlf & stu2
- Set stu1=Nothing
- 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)
- Class TestClass
- Sub Class_Initialize ' 設(shè)置 Initialize 事件。
- MsgBox("TestClass started")
- End Sub
- Sub Class_Terminate ' 設(shè)置 Terminate 事件。
- MsgBox("TestClass terminated")
- End Sub
- End Class
- Set X = New TestClass ' 創(chuàng)建一個 TestClass 實例。
- x.Class_Initialize '可正常運行
- Set X = Nothing ' 刪除實例。
注意:上面的例子中,即使把最后一句去掉,Class_Terminate事件仍然會發(fā)生,它會在腳本終止前被解釋器觸發(fā)。