對程序員和編程愛好者來說,,VB中類的技術(shù)是學(xué)習(xí)中的一個(gè)難點(diǎn),在大型軟件的開發(fā)過程中,模塊(Moudle),、控件(Active ocx),、鏈接庫(Active dll)和類(Class moudle)構(gòu)成了系統(tǒng)化、高效化的軟件工程,,而類的技術(shù)是控件和鏈接庫技術(shù)的基礎(chǔ),,因此掌握類的理論和編程方法是非常有意義的。 (一)類的基本定義和應(yīng)用概述,; 類是包含了方法,、屬性、數(shù)據(jù)成員的高級代碼模塊,,它既在模塊的范疇之內(nèi),,又是一個(gè)沒有圖形界面的Active ocx,程序員可以象使用控件一樣使用它,,但卻不能看到它,,值得注意的是,類是不能繼承的,。 類能夠使我們高效的完成對某一個(gè)或者某幾個(gè)特定的對象的復(fù)雜操作,,對象的動(dòng)作就是類的方法,對象的屬性就是類的屬性過程,。相對而言,,如果編程的對象是一組事物,那么,,我們采用標(biāo)準(zhǔn)模塊的方式是非常合適的,,在下列兩種情況下,應(yīng)該使用類進(jìn)行代碼處理: ?。?)創(chuàng)建大量性質(zhì)相近的對象,; (2)提高代碼的封裝性,。 類的創(chuàng)建非常簡單,,在進(jìn)行代碼編寫的時(shí)候,在“工程”菜單中選擇“添加類模塊”項(xiàng)目,,就可以添加一個(gè)空白的類,。 類文件一般以.cls作為擴(kuò)展名保存。 ?。ǘ╊惖姆椒ǖ膶?shí)現(xiàn),; 類的方法類似于動(dòng)態(tài)鏈接庫的接口函數(shù),它能夠接受其他窗體代碼的指定類型參數(shù),,并且傳遞到類中,。一般來說類的方法是能夠指定是否有返回值的,。它在類中通常是一個(gè)public過程。請看下面的代碼示例,,它使一個(gè)密碼框拒絕非字母的輸入: ?。?)類cls的代碼; Option Explicit'變量檢查 Private WithEvents mytxt As TextBox '本類中的方法接受和控制一個(gè)text密碼框 Dim isNUM As Boolean '類的模塊級變量 Public Sub Attach(itTEXT As TextBox) '接受外部變量到mytxt中 Set mytxt = itTEXT End Sub Private Sub mytxt_KeyUp(KeyCode As Integer, Shift As Integer) isNUM = (KeyCode > = 65) And (KeyCode < = 90) '測試密碼框的鍵盤輸入是否是英文字母 If isNUM = False Then Beep mytxt.Text = "" '如果輸入不是英文字母則響鈴并且清空密碼框內(nèi)容 MsgBox "非法字符輸入!" End If Debug.Print mytxt.Text '調(diào)試輸出密碼框內(nèi)容 End Sub '類的代碼結(jié)束 (2)類的引用,; 已經(jīng)編寫完成的類可以經(jīng)過兩種格式進(jìn)行引用,,第一種方式:Private(public或者dim) myCLS(指定的類名) As New cls(編寫完成的類名),;第二種方式較多用于程序編寫風(fēng)格較“老”的程序員:首先在窗體代碼中進(jìn)行模塊級聲明――Dim myCLS As cls,然后在具體代碼過程中進(jìn)行具體定義―― Set mycls = New cls。這兩種方式的效率和代碼的簡潔性方面可能會(huì)有所差別,但在筆者的編程實(shí)踐中,并沒有什么特別的感覺,,不過我較多使用第一種方式,因?yàn)樗鼤鴮懫饋砀臃奖?。另外,,在代碼結(jié)束的時(shí)候,使用 Set myCLS = Nothing來取消類的資源占用是一種非常好的編程習(xí)慣,。 在窗體form1中(窗體有一個(gè)密碼框控件text1,,passworldchar="*")添加以下代碼: Option Explicit Private myCLS As New cls '引用cls Private Sub Form_Load() myCLS.Attach Text1 '啟動(dòng)類 End Sub '在代碼結(jié)束時(shí)記得釋放資源 Private Sub Form_Unload(Cancel As Integer) Set myCLS = Nothing End End Sub 本文代碼展示了類的方法的代碼編寫過程和調(diào)用方式(盡管它和類的事件非常相似),它的效果是,,如果密碼框中被輸入了非字母,,則系統(tǒng)振鈴,并刪除密碼框中的原來的數(shù)據(jù)――在一定程度上保護(hù)密碼,。 類的方法可以不需要任何參數(shù),這一點(diǎn)類似一個(gè)public的函數(shù)或者過程,,它也是類中使用最廣泛的,。在下一篇文章中我將討論,如何使用類的屬性,、事件和方法進(jìn)行綜合編程,。 我們討論了類的理論、類的創(chuàng)建和類的方法的編程實(shí)踐,,實(shí)際上,,類之所以能夠在軟件工程中廣泛應(yīng)用,最主要的一點(diǎn)是它可以非常方便的封裝許多編程需要的屬性,,這不僅使程序員在一定程度上克服控件(ocx)和鏈接庫(dll)設(shè)計(jì)和調(diào)試中的復(fù)雜性,,而且能夠提高程序代碼的簡潔和高效性――本文將討論完整的類的編程,包括方法,、屬性和基本事件,。 ?。ㄒ唬╊惖膶傩缘奶卣骱投x; 類似于標(biāo)準(zhǔn)控件的屬性,,類的屬性允許用戶在指定的數(shù)據(jù)范圍內(nèi)進(jìn)行賦值,,這些值被類內(nèi)的各個(gè)代碼部分所共享。屬性的獲得和傳遞需要經(jīng)過 Property Let和Property Get語句進(jìn)行編程,,當(dāng)然,,我們首先需要在類中進(jìn)行全局或者模塊級的相應(yīng)變量定義。 ?。ǘ┦录膶傩院突径x,; 和窗體的事件類似,類也有兩個(gè)基本的事件,,Class_Initialize(類加載時(shí)觸發(fā))和Class_Terminate(類卸載時(shí)觸發(fā)),,這兩個(gè)事件都是private的。實(shí)際上,,我們完全可以忽略這兩個(gè)事件――只要你記得完善類的方法和屬性,。 類同樣可以定義自己的事件,它和方法的程序編寫格式類似,,只不過需要WithEvents關(guān)鍵字進(jìn)行參數(shù)聲明,而且事件不能有任何命名參數(shù)或者可選參數(shù),,它也沒有返回值。 實(shí)際上,,結(jié)構(gòu)良好的方法和屬性完全可以替代結(jié)構(gòu)復(fù)雜的類的事件,。 (三)類的方法,、事件和屬性的編程實(shí)例,; 本程序的設(shè)計(jì)目的是,通過類控制窗體中文本框的內(nèi)容的全部大寫,、小寫和逆向排序轉(zhuǎn)化,。 為了方便代碼的書寫和調(diào)用,我在類中引用了枚舉的編程方法,。 以下代碼在類Class1: Option Explicit Private WithEvents myTXT As TextBox '方法的參數(shù)接口 Public Enum sTYLE Lcaseit'小寫屬性 Lbigit'大寫屬性 Nlogoit'逆向排序?qū)傩?BR> End Enum '自定義枚舉,,用來實(shí)現(xiàn)屬性的自動(dòng)賦值 Private mvarBiaozhi As sTYLE '實(shí)現(xiàn)枚舉常量的連接 Public Function dONE() As String' 'DONE方法用來根據(jù)指定的枚舉屬性,對 '窗體文本框進(jìn)行相應(yīng)的字符轉(zhuǎn)化操作 '并且返回轉(zhuǎn)化后的字符串 If mvarBiaozhi = Nlogoit Then dONE = StrReverse(myTXT) '逆向排序 ElseIf mvarBiaozhi = Lcaseit Then dONE = LCase(myTXT) '強(qiáng)制小寫轉(zhuǎn)化 Else dONE = UCase(myTXT) '強(qiáng)制大寫轉(zhuǎn)化 End If End Function 'DONE方法結(jié)束 Public Property Let Biaozhi(ByVal vData As sTYLE) '獲得屬性的被賦的值 mvarBiaozhi = vData End Property Public Property Get Biaozhi() As sTYLE '傳遞屬性值到類中 Set Biaozhi = mvarBiaozhi End Property Public Sub Attach(itTEXT As TextBox) '連接類的方法 Set myTXT = itTEXT End Sub Private Sub Class_Initialize() '本事件在類倍加載時(shí)激活 MsgBox "你好,!本程序向您展示使用類的方法,、屬性、事件進(jìn)行編程的技術(shù),!" End Sub Private Sub Class_Terminate() '本事件在類被卸載時(shí)激活 MsgBox "你好,!記得在Class_Terminate中填寫對象撤銷后的代碼!" End Sub '類的代碼全部結(jié)束 ?。ㄋ模┐绑w代碼的引用編程,; 在窗體FORM1中添加文本控件TEXT1,、下拉列表控件COMBO1、命令按鈕COMMAND1(CAPTION="開始轉(zhuǎn)化"),,調(diào)整三個(gè)控件到適當(dāng)位置,。 Dim myT As New Class1 '類的引用 Private Sub Form_Load() Combo1.Clear Combo1.AddItem "字符串大寫轉(zhuǎn)化" Combo1.AddItem "字符串小寫轉(zhuǎn)化" Combo1.AddItem "字符串逆向排序" Combo1.ListIndex = 0 '在列表框中添加屬性選項(xiàng) End Sub Private Sub Command1_Click() '當(dāng)命令按鈕按下時(shí)激活類 myT.Attach Text1 '方法參數(shù)聯(lián)接 Select Case Combo1.ListIndex Case 0 myT.Biaozhi = Lbigit Case 1 myT.Biaozhi = Lcaseit Case 2 myT.Biaozhi = Nlogoit End Select '根據(jù)列表框的選擇,給類的Biaozhi屬性賦值 '注意,,在編程環(huán)境中,,上述屬性值自動(dòng)添加 Text1.Text = myT.dONE '返回排序結(jié)束后的字符串 End Sub Private Sub Form_Unload(Cancel As Integer) Set myT = Nothing End '良好的編程習(xí)慣 End Sub 怎么樣,我們的代碼看起來如此的簡潔,,這種感覺就象是在使用一個(gè)控件,,不僅可以隨心所欲的調(diào)用,而且方便的使用了vb的自動(dòng)提示功能,。 ?。ㄎ澹╆P(guān)于類的編程技術(shù)的總結(jié); 嚴(yán)格的說,,類是vb編程中的一個(gè)相當(dāng)有用的技術(shù),,同樣也是學(xué)習(xí)和掌握中的難點(diǎn),類在大型軟件工程中應(yīng)用是非常廣泛和卓有成效的,,但是,,在小型軟件開發(fā)中,為了提高軟件的效率和代碼的清晰度,,應(yīng)該避免使用較多的類模塊,,控件和聯(lián)接庫,取代以標(biāo)準(zhǔn)模塊,。 本文所示例的代碼比較簡單,,卻覆蓋了關(guān)于模塊編程技術(shù)的方方面面,希望初學(xué)者能夠有所借鑒,,也希望程序員能夠共同探討,。我們應(yīng)該相信,無論多么復(fù)雜的高樓大廈都是由普普通通的方磚堆砌而成的,,同樣,無論所么復(fù)雜的軟件工程都是由基本的程序語句所構(gòu)成的,,編程愛好者,、程序員和分析員的區(qū)別只是在于,用同樣的程序語句構(gòu)建的程序的不同而已,。
|