VB類模塊和標(biāo)準(zhǔn)模塊使用和區(qū)別_第1頁
VB類模塊和標(biāo)準(zhǔn)模塊使用和區(qū)別_第2頁
VB類模塊和標(biāo)準(zhǔn)模塊使用和區(qū)別_第3頁
VB類模塊和標(biāo)準(zhǔn)模塊使用和區(qū)別_第4頁
VB類模塊和標(biāo)準(zhǔn)模塊使用和區(qū)別_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.:.;類模塊和規(guī)范模塊類模塊和規(guī)范模塊的不同點在于存儲數(shù)據(jù)方法的不同。規(guī)范模塊的數(shù)據(jù)只需一個備份。這意味著規(guī)范模塊中一個公共變量的值改動以后,在后面的程序中再讀取該變量時,它將得到同一個值。而類模塊的數(shù)據(jù),是相對于類實例也就是,由類創(chuàng)建的每一對象而獨立存在的。 同樣的,規(guī)范模塊中的數(shù)據(jù)在程序作用域內(nèi)存在,也就是說,它存在于程序的存活期中;而類實例中的數(shù)據(jù)只存在于對象的存活期,它隨對象的創(chuàng)建而創(chuàng)建,隨對象的吊銷而消逝。 最后,當(dāng)變量在規(guī)范模塊中聲明為Public時,那么它在工程中任何地方都是可見的;而類模塊中的Public變量,只需當(dāng)對象變量含有對某一類實例的援用時才干訪問。 上面的比較,同樣

2、適用于規(guī)范模塊和類模塊中的公共過程,用下面的例子可以闡明。新建一個工程,并在“工程菜單中個添加一個規(guī)范模塊和一個類模塊,然后運轉(zhuǎn)以下的代碼: 把下面的代碼放在 Class1 中:下面是 Class1 對象的一個屬性。 Public Comment As String 下面是 Class1 對象的一個方法。 Public Sub ShowComment() MsgBox Comment, , gstrVisibleEverywhere End Sub 把下面的代碼放在 Module1 中: 規(guī)范模塊中的代碼是全局的。 Public gstrVisibleEverywhere As String

3、Public Sub CallableAnywhere(ByVal c1 As Class1) 下行改動一個全局變量,這是一個Class1實例的屬性 只需傳送給該過程的個別對象才遭到影 c1ment = Touched by a global function. End Sub 把兩個命令按鈕放在 Form1 上,并在 Form1 中添加以下的代碼: Private mc1First As Class1 Private mc1Second As Class1 Private Sub Form_Load() 創(chuàng)建兩個 Class1 類的實例。 Set mc1First = New Class1

4、Set mc1Second = New Class1 gstrVisibleEverywhere = Global string data End Sub Private Sub Command1_Click() Call CallableAnywhere(mc1First) mc1First.ShowComment End Sub Private Sub Command2_Click() mc1Second.ShowComment End Sub 按F5鍵,運轉(zhuǎn)該工程。當(dāng)Form1加載時,它創(chuàng)建兩個 Class1類實例,每個實例有本人的數(shù)據(jù)。同時,F(xiàn)orm1設(shè)置了下面全局變量gstrVisi

5、bleEverywhere的值。 按下Command1,調(diào)用全局過程并傳送援用給第一個Class1對象。全局過程設(shè)置Comment屬性,然后Command1調(diào)用ShowComment方法顯示該對象的數(shù)據(jù)。 正如圖1所示,結(jié)果信息框演示了全局過程CallableAnywhere如何設(shè)置對象的Comment屬性,而且全局字符串在Class1內(nèi)部是可見的。 圖1第一個Class1對象的信息框按下Command2,調(diào)用第二個Class1類實例的ShowComment方法。 如圖 9.7 所示,兩個對象都訪問了全局字符串變量;然而,第二個對象的Comment屬性是空的,由于對全局過程CallableAn

6、ywhere的調(diào)用只改動第一個對象的Comment屬性。 圖2第二個Class1對象的信息框 重點:要防止類的代碼依賴于全局變量,也就是規(guī)范模塊中的公共變量。一個類的許多實例可以同時存在,一切這些對象在程序中共享全局數(shù)據(jù)。 在類模塊代碼中運用全局變量也違背了面向?qū)ο蠓庋b的編程原那么,由于由這樣的類所創(chuàng)建的對象并沒有包含它們的一切數(shù)據(jù)。 靜態(tài)類數(shù)據(jù) 有時,希望由一個類模塊所創(chuàng)建的一些對象共享某個數(shù)據(jù)項。這就是所謂的靜態(tài)類數(shù)據(jù)。 不能在Visual Basic類模塊中實現(xiàn)真正的靜態(tài)類數(shù)據(jù)。但是,經(jīng)過運用Property過程在規(guī)范模塊中設(shè)置及前往Public數(shù)據(jù)成員的值,可以仿真靜態(tài)類數(shù)據(jù),如以下的

7、代碼: 只讀屬性前往運用程序的名字。 Property Get CommonString() As String 變量 gstrVisibleEverywhere 保管在 規(guī)范模塊中,并聲明為 Public。 CommonString = gstrVisibleEverywhere End Property 留意:在類模塊中,對模塊級的變量不能聲明為Static,Static數(shù)據(jù)只能在過程中運用。 由Property Let過程對于含有對象援用的屬性,運用Property Set對規(guī)范模塊數(shù)據(jù)成員賦予新的值,可以仿真非只讀的靜態(tài)類數(shù)據(jù)。然而,這種運用全局變量的方式違背了封裝編程的原那么,而且不

8、引薦運用。 例如,變量gstrVisibleEverywhere可以在工程中任何地方賦值,甚至可以從別的類代碼中賦值,只需該類具有CommonString屬性。這樣做能導(dǎo)致程序中非常微妙的錯誤。 對象模型 經(jīng)過創(chuàng)建類模塊并賦以屬性和方法,就可以定義了類,接著就可以由該類創(chuàng)建恣意數(shù)量的對象。如何記錄所創(chuàng)建的這些對象呢? 記錄對象最簡單的方法,莫過于為創(chuàng)建的每個對象都聲明一個對象變量。當(dāng)然,這樣對可以創(chuàng)建對象的數(shù)量就有了限制??梢栽谀硞€數(shù)組或者集合中堅持多個對象援用. 剛開場時,能夠要定位窗體或規(guī)范模塊中的對象變量、對象數(shù)組以及對象集合,就跟處置普通變量一樣。但是,隨著添加更多的類,能夠會發(fā)現(xiàn)正運

9、用的這些對象之間有明確的關(guān)系。 對象模型表達了包含關(guān)系 ,對象模型給出了基于對象程序的構(gòu)造。經(jīng)過定義程序中所運用的對象之間的關(guān)系,對象模型可以以一種使編程變得更容易的方式來組織對象。 普通來說,對象模型表達了這樣一個現(xiàn)實:即某些對象是“更大的,或者說比其它對象更重要一些可以以為這些對象是包含其它對象的對象,或者是由其它對象所組成的對象。 例如,在編程時,能夠創(chuàng)建一個SmallBusiness對象來作為程序的中心。能夠想讓這個SmallBusiness對象包含與其關(guān)聯(lián)的其它類型的對象,比如Employee對象和Customer對象。能夠同時也希望它包含一個Product對象??梢远x四個類模塊,

10、分別叫做SmallBusiness、Employee、Customer和Product類模塊,并給它們中的每個添加適宜的屬性和方法,但是怎樣在對象之間建立銜接呢?有兩種工具可以到達這個目的:即Object屬性和Collection對象。以下這段代碼顯示了實現(xiàn)分層構(gòu)造的一種方法: SmallBusiness 類模塊中聲明部分的代碼。 Public Name As String Public Product As New Product Public Employees As New Collection Public Customers As New Collection 第一次援用Produc

11、t屬性時,將創(chuàng)建對象,由于曾經(jīng)把它聲明為As new。例如,可以用下面的代碼創(chuàng)建并設(shè)置SmallBusiness對象的Product對象的稱號和價錢。 一個規(guī)范模塊的代碼。 Public sbMain As New SmallBusiness Sub Main sbMain.Name = Velociraptor Enterprises, Inc. 在代碼中初次運用Product變量時,創(chuàng)建Product對象。 sbMain.Product.Name = Inflatable Velociraptor sbMain.Product.Price = 1.98 . . 初始化并顯示主窗體的代碼。

12、. End Sub 留意: 用公共變量來實現(xiàn)一個對象屬性并不簡約。假設(shè)在代碼中的某處,將該屬性設(shè)置為Nothing的話,能夠會無意中將Product對象吊銷。更好的方法是創(chuàng)建對象屬性時,將之設(shè)置為只讀屬性,如以下代碼所示。 為更強壯的對象屬性所編制的代碼,該屬性的存儲是私有的, 因此不能從對象的外部將之設(shè)置為Nothing。 Private mProduct As New Product Property Get Product() As Product 初次調(diào)用這個屬性時,mProduct包含Nothing, 因此Visual Basic將創(chuàng)建一個Product對象。 Set Product

13、 = mProduct End If 一對多對象關(guān)系 當(dāng)對象之間關(guān)系是一對一時,對象屬性可以正常任務(wù)。然而,經(jīng)常出現(xiàn)的情況卻是,某種類型的一個對象包含另一種類型的一些對象。在SmallBusiness對象模型中,Employees屬性是作為一個Collection對象來實現(xiàn)的,因此,這個SmallBusiness對象可以包含多個Employee對象。以下代碼顯示了怎樣把新的Employee對象添加到這個集合中。 Public Function NewEmployee(Name, Salary, HireDate, _ ID) As Employee Dim empNew As New Empl

14、oyee empNew.Name = Name 對象的隱含創(chuàng)建。 empNew.Salary = Salary empNew.HireDate = HireDate 添加到集合中,并運用ID作為一個鍵。 sbMain.Employees.Add empNew, CStr(ID) 前往對新 Employee 的援用。 Set NewEmployee = empNew End Function 在創(chuàng)建SmallBusiness對象所代表的企業(yè)雇員時,需求調(diào)用這個NewEmployee函數(shù)多少次,就可以調(diào)用多少次。任何時候,經(jīng)過遍歷Employees集合,都可將現(xiàn)有的雇員列出。 留意: 再次闡明,并

15、沒有非常強壯的實現(xiàn)方法。比較好的實際是創(chuàng)建本人的集合類,并將它們按只讀屬性給出。這在“創(chuàng)建本人的集合類中作了討論。 提示: 在Visual Basic的專業(yè)版和企業(yè)版中,包括Class Builder適用工具,利用這個適用工具,可以產(chǎn)生實現(xiàn)對象模型時需求的大量代碼。Class Builder可創(chuàng)建強壯的對象屬性和集合類,并且可以很容易地重新組織對象模型。 Parent 屬性 具有對象的援用時,經(jīng)過運用對象屬性和對象集合,就可以到達這個援用所包含的對象??梢韵蚍謱訕?gòu)造的上層挪動也是非常有用的,由于可以到達包含所援用對象的那個對象。向上挪動通常是用Parent屬性來完成的。Parent屬性前往對象

16、容器的援用。關(guān)于對象模型定位的討論,請參閱“用部件編程中的“定位對象模型。提示 當(dāng)把Parent屬性賦給集合中的對象時,不要運用對Collection對象的援用。這個對象真正的父是包含該集合的對象。假設(shè)Parent屬性指向了該集合,將不得不運用兩級間接指針,才干到達真正的父也就是說,要用obj.Parent.Parent,而不是obj.Parent。 Parent 屬性、循環(huán)援用,以及對象裝配 運用Parent屬性的一個最大問題是它們會呵斥循環(huán)援用。“較大的對象具有對所包含對象的援用,而被包含的對象經(jīng)過其Parent屬性也有援用,這樣就創(chuàng)建了一個環(huán)。 在這幅圖片上有什么錯誤?去除這些對象的方法

17、,是在用對象完成任務(wù)后,釋放一切對它們的援用。假設(shè)對 SmallBusiness 對象的援用是在一個名為sbMain的變量中,就象在本節(jié)主題前面討論的那樣,能夠會寫出象下面這樣的代碼: Set sbMain = Nothing 不幸的是,依然有一個對 SmallBusiness 對象的援用現(xiàn)實上,能夠有許多援用,由于每個Employee對象的Parent屬性都將包含對這個SmallBusiness對象的援用。 由于SmallBusiness對象的Employees集合包含有對每個Employee對象的援用,因此任何對象都不會被吊銷。 TearDown 方法 一個處理這個問題的方法是,把Tear

18、Down方法添加給該SmallBusiness對象。這樣,就可以將一切SmallBusiness對象的對象屬性設(shè)置為Nothing,同時也將一切Collection對象 (Employees, Customers)設(shè)置為Nothing。 當(dāng)Collection對象被吊銷時,Visual Basic就把它所包含的一切對象援用設(shè)置為Nothing。假設(shè)沒有對包含Employees和Customers 集合中的Employee和Customer對象其它的援用,那么它們將被吊銷。 當(dāng)然,假設(shè)Employee對象是由更小的對象構(gòu)成的,那么將會存在其父對象所具有的同樣的循環(huán)援用問題。在那種情況下,必需將一

19、個TearDown方法賦給Employee類。要做的事情并不僅僅是將Employees的Collection對象設(shè)置為Nothing,SmallBusiness對象還將不得不首先遍歷該集合,調(diào)用每個Employee對象的TearDown方法。其它問題 即使這樣,也并非一切對象都能被吊銷。假設(shè)在程序的某個地方還有一些變量,這些變量依然包含對SmallBusiness對象,或者對SmallBusiness對象所包含的任何對象的援用,那么這些對象將不會被破壞。程序中必需有一部分清理代碼,以確保各個地方的一切對象變量都被設(shè)置為Nothing。 為了測試能否正發(fā)生這種情況,能夠需求將一些調(diào)試代碼添加到對象中。例如,可以將以下代碼添加到規(guī)范模塊中:全局調(diào)試集合Public gcolDebug As New Collection 全局函數(shù),賦給每個對象一個獨一的 ID。 Public Function DebugSerial() As Long S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論