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ù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、Public Sub CallableAnywhere(ByVal c1 As Class1) 下行改動(dòng)一個(gè)全局變量,這是一個(gè)Class1實(shí)例的屬性 只需傳送給該過程的個(gè)別對(duì)象才遭到影 c1ment = Touched by a global function. End Sub 把兩個(gè)命令按鈕放在 Form1 上,并在 Form1 中添加以下的代碼: Private mc1First As Class1 Private mc1Second As Class1 Private Sub Form_Load() 創(chuàng)建兩個(gè) Class1 類的實(shí)例。 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鍵,運(yùn)轉(zhuǎn)該工程。當(dāng)Form1加載時(shí),它創(chuàng)建兩個(gè) Class1類實(shí)例,每個(gè)實(shí)例有本人的數(shù)據(jù)。同時(shí),F(xiàn)orm1設(shè)置了下面全局變量gstrVisi

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

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

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

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

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

10、分別叫做SmallBusiness、Employee、Customer和Product類模塊,并給它們中的每個(gè)添加適宜的屬性和方法,但是怎樣在對(duì)象之間建立銜接呢?有兩種工具可以到達(dá)這個(gè)目的:即Object屬性和Collection對(duì)象。以下這段代碼顯示了實(shí)現(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屬性時(shí),將創(chuàng)建對(duì)象,由于曾經(jīng)把它聲明為As new。例如,可以用下面的代碼創(chuàng)建并設(shè)置SmallBusiness對(duì)象的Product對(duì)象的稱號(hào)和價(jià)錢。 一個(gè)規(guī)范模塊的代碼。 Public sbMain As New SmallBusiness Sub Main sbMain.Name = Velociraptor Enterprises, Inc. 在代碼中初次運(yùn)用Product變量時(shí),創(chuàng)建Product對(duì)象。 sbMain.Product.Name = Inflatable Velociraptor sbMain.Product.Price = 1.98 . . 初始化并顯示主窗體的代碼。

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

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論