国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
淺談VB6中的自定義類(lèi)的使用
    PS:除非特別聲明,本文所說(shuō)VB指的是VB6,而非VB.NET。

   大家都知道,VB是一種半面向?qū)ο螅ㄒ灿腥朔Q(chēng)之為“偽面向?qū)ο蟆保┑恼Z(yǔ)言,他雖然可以寫(xiě)自定義的類(lèi),但是由于種種原因,使得他在這方面的發(fā)育產(chǎn)生了一點(diǎn)問(wèn)題,比如說(shuō):VB寫(xiě)出來(lái)的類(lèi)是不能繼承的(不孕不育?!-_-#...傳說(shuō)VB的偶像是東方不敗……殘念-_-#!),你無(wú)法像在C++/C#/JAVA==中一樣自由的使用類(lèi)。你很難想象類(lèi)沒(méi)有繼承會(huì)有啥用途。還有,在VB中,一個(gè)類(lèi)模塊只能寫(xiě)一個(gè)類(lèi),這意味著如果你的Project中使用了N個(gè)類(lèi),你必須忍受它帶著N個(gè)類(lèi)模塊文件,甚至其中有些只是小小小類(lèi)。這些都造成VB的類(lèi)的可用性和重用性不佳。
   但是,VB是否在類(lèi)的方面就這么無(wú)能呢?答案是否定的,在很多時(shí)候(特別是需要將很多功能封裝,形成模塊化的時(shí)候),VB 的自定義類(lèi)還是能派上用場(chǎng)的。這里,有人可能會(huì)想到使用ActiveX控件,雖然在VB中,可以使用ActiveX控件做到上述功能,但是寫(xiě)ActiveX控件要比寫(xiě)類(lèi)麻煩得多,而且ActiveX控件的資源占用也要比類(lèi)大。當(dāng)然,如果你只想去往上搜搜ActiveX控件,然后拼成一個(gè)程序的話(huà),我完全可以對(duì)你說(shuō):“原諒我浪費(fèi)了你的生命!”

   那么接下來(lái),我們就已Animal為主題講講在VB6中寫(xiě)自定義類(lèi)的方法~

  成員函數(shù)和成員變量

   首先,我們需要添加一個(gè)類(lèi)模塊,然后將它的名稱(chēng)改成Animal,那么,這個(gè)類(lèi)的名字就是Animal。然后再寫(xiě)入下列代碼:
引用:
Private m_strName As String, m_bytLegs As Byte, m_blnBark As Boolean

Public Sub 
SetAnimalName(ByVal strName As String)

   m_strName = strName  
'/// 設(shè)置Animal的名字

End Sub

Public Function 
GetAnimalName() As String

  
GetAnimalName = m_strName  
'/// 返回Animal的名字

End Function

Public Sub 
SetLegs(ByVal bytLegs As Byte)

   m_bytLegs = bytLegs  
'/// 設(shè)置Animal的腿數(shù)

End Sub

Public Function 
GetLegs() As Byte

  
GetLegs = m_bytLegs  
'/// 返回Animal的腿數(shù)

End Function

Public Sub 
SetBark(ByVal blnBark As Boolean)

   m_blnBark = blnBark  
'/// 設(shè)置Animal是否會(huì)叫

End Sub

Public Function 
GetBark() As Boolean

  
GetBark = m_blnBark  
'/// 返回Animal是否會(huì)叫

End Function
如此,我們已經(jīng)寫(xiě)好了Animal類(lèi)的大體結(jié)構(gòu),現(xiàn)在我們來(lái)看看這些代碼。
引用:
Private m_strName As String, m_bytLegs As Byte, m_blnBark As Boolea  '/// 聲明成員變量
這里的Private等同于Dim,為了更直觀,所以這樣寫(xiě)。因?yàn)樵陬?lèi)模塊中,也可以用Public聲明變量。用Private(Dim)和Public聲明的變量,他們的作用域不同:Private聲明的變量只能在類(lèi)的內(nèi)部被訪(fǎng)問(wèn),在外部是不可見(jiàn)的,而用Public聲明的變量在外部是可見(jiàn)的,這意味著你在外部就可以直接修改類(lèi)中的變量,這看起來(lái)很方便,但是任何無(wú)意的修改所造成的后果都可能是無(wú)法預(yù)估的。所以,為了更好的封裝類(lèi),通常用Private聲明。當(dāng)然,在某些特定條件下,我們也可以使用Public。(詳情請(qǐng)看下文)

   然后,我們定義了幾個(gè)成員函數(shù),用它完成相應(yīng)的功能。至于什么是成員函數(shù)(還有剛才提到的成員變量),這點(diǎn)大家可以不必了解,這其實(shí)是C++的叫法,只不過(guò)上校在VB中也習(xí)慣這么叫。這完全是稱(chēng)呼問(wèn)題。大家可以看到,我把變量名寫(xiě)成m_XXX,這里的m_是成員變量的標(biāo)記,用于和其他變量區(qū)分,這是典型的匈牙利命名法。

   BTW:關(guān)于匈牙利命名法,大家可以去Google了解下。個(gè)人感覺(jué)匈牙利命名法在VB中實(shí)用性很強(qiáng),所以我的聲明習(xí)慣基本都符合匈牙利命名法。

   然后我們看看后面的一些函數(shù)。他們都用Public聲明,原因和前面聲明成員變量類(lèi)似,這里不再闡述。函數(shù)功能也都已注釋?zhuān)蠹铱梢宰约嚎础?br>
類(lèi)的使用方法

   類(lèi)寫(xiě)好了,我們要開(kāi)始使用它。和使用其他數(shù)據(jù)類(lèi)型一樣,我們要先聲明。但是有所不同的是,類(lèi)的聲明通常有兩種方法:
引用:
Dim cAnimal As Animal

Set cAnimal = New Animal
————————————————————
Dim cAnimal As New Animal
兩者相同之處在于都聲明了一個(gè)名為cAnimal的對(duì)象變量,并用New將其實(shí)例化,這是使用自定義類(lèi)所必需的。而兩者的不同在于后者在聲明Animal對(duì)象變量的時(shí)候就將其實(shí)例化,而前者則是先聲明對(duì)象變量,再在適當(dāng)?shù)臅r(shí)候?qū)⑵鋵?shí)例化。相比之下,前者可以控制實(shí)例化類(lèi)的時(shí)間和場(chǎng)合,因此更為自由,普遍。

說(shuō)完了聲明我們先來(lái)講講類(lèi)的銷(xiāo)毀。每一個(gè)類(lèi)的使用都要占用一定的資源,當(dāng)不需要這些類(lèi)時(shí),需要釋放他們所占用的資源,這是良好的Coding Habits~
   類(lèi)的銷(xiāo)毀比較簡(jiǎn)單,只需要
引用:
Set cAnimal = Nothing
即可。
這里建議大家在聲明完類(lèi)之后,就馬上在適當(dāng)?shù)牡胤綄?xiě)入銷(xiāo)毀類(lèi)的代碼,避免因?yàn)檫z忘而造成錯(cuò)誤。

接下來(lái),我們要開(kāi)始使用我們的Animal類(lèi)
引用:
Private Sub Form_Load()

  
'/// 設(shè)置相關(guān)選項(xiàng)
  
  
Set cAnimal = New Animal
  
  With cAnimal
  
.SetAnimalName ("IceBear")

.SetLegs (4)

.SetBark (True)
  
  End With

End Sub
我們?cè)诖绑w加載的時(shí)候?qū)嵗薱Animal這個(gè)類(lèi)變量,,然后設(shè)置了Name/Legs/Bark等屬性。
使用類(lèi)實(shí)例和使用控件很像,當(dāng)輸入類(lèi)名+. 即cAnimal.的時(shí)候,就會(huì)出現(xiàn)信息條

然后進(jìn)行相應(yīng)操作即可。
引用:
Private Sub Form_Click()

  With cAnimal
  
Debug.Print "Animal Name:" & .GetAnimalName & vbNewLine & "Animal Legs:" & .GetLegs

Debug.Print "Is Bark:" & .GetBark
  
  End With

End Sub
單擊窗口后,立即窗口就會(huì)出現(xiàn):
引用:
Animal Name:IceBear
Animal Legs:4
Is Bark:True
這時(shí),你就可以向你暗戀的女生說(shuō)你能在VB里寫(xiě)類(lèi)了。(但是千萬(wàn)別提到這類(lèi)不能繼承……-_-#!)

類(lèi)的屬性

不知道大家有沒(méi)有發(fā)現(xiàn),無(wú)論我們是獲取,還是設(shè)置Name/Legs/Bark的信息,都需要使用一個(gè)單獨(dú)的成員函數(shù)。而我們?cè)谑褂每丶r(shí),那些都是作為屬性(Property)來(lái)實(shí)現(xiàn)的。所以,接下來(lái),我們要研究如何在自定義類(lèi)中實(shí)現(xiàn)屬性。

為了方便之后對(duì)比,我們僅把Name轉(zhuǎn)化為屬性實(shí)現(xiàn):
引用:
Public Property Get Name() As String

  
Name = m_strName  
'/// 返回Animal的名字

End Property

Public Property Let 
Name(ByVal strAnimalName As String)

   m_strName = strAnimalName  
'/// 設(shè)置Animal的名字

End Property

我們可以發(fā)現(xiàn),屬性的定義和成員函數(shù)定義很相似。Get就像Function,而Let類(lèi)似于Sub。因?yàn)镚et是返回屬性,所以通常沒(méi)有參數(shù),而Let為了讓我們?cè)O(shè)置屬性,所以必須要有一個(gè)參數(shù)。
這樣,我們就可以像在控件中一樣,直接使用Name這個(gè)屬性來(lái)設(shè)置和獲取相關(guān)信息。

BTW:如果你覺(jué)得編寫(xiě)屬性過(guò)程太麻煩,可以使用工具菜單中的添加過(guò)程來(lái)減輕工作量
   另外,我們可以通過(guò)只編寫(xiě)Let或者Get過(guò)程來(lái)生成只讀/只寫(xiě)的屬性

看到這里,不知道大家想過(guò)沒(méi)有,既然Get/Let屬性過(guò)程很像Function/Sub,而Function/Sub是可以有多個(gè)參數(shù)的,那么Get/Let屬性是不是也可以有參數(shù)呢?
當(dāng)然,這是可以的,只不過(guò)相當(dāng)少見(jiàn)(我們平常在用控件屬性時(shí),MS都沒(méi)遇到過(guò)),而且它還有著比較嚴(yán)格的規(guī)定和限制,如果你對(duì)這方面不感興趣或者認(rèn)為用不著,可以跳到后面去。
現(xiàn)在我們就額外添加一個(gè)Age的參數(shù),看看如何在屬性過(guò)程中使用多參數(shù)。
首先我們的屬性過(guò)程要改為:
引用:
Public Property Get Name(ByVal intAge As IntegerAs String

  
Name = m_strName  
'/// 返回Animal的名字

End Property

Public Property Let 
Name(ByVal intAge As IntegerByVal strAnimalName As String)

   m_strName = strAnimalName & " is " & intAge

End Property
Get和Let同時(shí)多了一個(gè)相同的參數(shù)。不管怎么樣,Let過(guò)程總會(huì)比Get多一個(gè)參數(shù)。并且,Get過(guò)程的1--N個(gè)參數(shù)要和Let過(guò)程的1--N個(gè)參數(shù)一致(包括函數(shù)名、類(lèi)型、傳入方式等),Get的返回值類(lèi)型要和Let的第N+1 個(gè)參數(shù)(最后一個(gè)參數(shù))的類(lèi)型相等。
我們可以通過(guò)一張圖片來(lái)大致了解下Let過(guò)程的調(diào)用。

所以,相應(yīng)的,我們對(duì)Name屬性的代碼也要更改如下:
引用:
.Name(20) = "IceBear"
& .Name(19)
運(yùn)行后,立即窗口就會(huì)出現(xiàn):
引用:
Animal Name:IceBear is 20
Animal Legs:4
Is Bark:True
但是,當(dāng)我們?cè)谑褂肎et過(guò)程時(shí),那個(gè)參數(shù)并沒(méi)有作用,卻又必須存在。這時(shí),我們可以將其聲明為可選參數(shù),這樣,Get確有參數(shù)存在,我們也可以免去放入無(wú)用實(shí)參的麻煩。
引用:
Public Property Get Name(Optional ByVal intAge As IntegerAs String
雖然在屬性過(guò)程中使用多個(gè)參數(shù)可以在一定程度上加快便捷,但是這是犧牲實(shí)用性為代價(jià)的。多個(gè)參數(shù)的過(guò)程屬性在使用上非常不便,而且看起來(lái)不倫不類(lèi)的。所以,上校建議如非真的必要,就不要使用多參數(shù)。

特殊的類(lèi)屬性

其實(shí),在VB的Class里,還有一種很普通但不普遍的類(lèi)屬性——共有成員變量。
我們?cè)谥皬?qiáng)調(diào)過(guò),一般情況下,成員變量應(yīng)為私有,這是封裝的要求。而如果成員變量的屬性是共有的,則其在外部也可以被訪(fǎng)問(wèn),這就形成了一個(gè)簡(jiǎn)單的類(lèi)屬性,屬性名就是他的變量名。
和屬性過(guò)程相比,公有成員變量不能設(shè)置為只讀/只寫(xiě),無(wú)法在更改自己的同時(shí)更改其他的屬性值,也不能驗(yàn)證數(shù)據(jù)等。(因?yàn)樾薷墓灿凶兞繉傩詢(xún)H是修改它的值,而通過(guò)屬性過(guò)程,則可以進(jìn)行一系列的操作)但是共有成員變量作為屬性,能很大程度上減少代碼量,簡(jiǎn)化操作。下面有一些使用類(lèi)屬性的原則,僅供參考:
引用:
From:M$ MSDN
以下情況應(yīng)使用屬性過(guò)程: 
·        屬性為只讀,或一旦設(shè)置就不能改變。
·        屬性已設(shè)置的值需要驗(yàn)證。
·        超出特定范圍的值。例如,負(fù)數(shù),雖符合屬性的數(shù)據(jù)類(lèi)型,但屬性如果允許這樣的假設(shè)值出現(xiàn),就會(huì)導(dǎo)致程序出錯(cuò)。
·        屬性的設(shè)置可導(dǎo)致一些對(duì)象狀態(tài)的明顯變化,例如,Visible 屬性。
·        屬性設(shè)置可改變內(nèi)部變量或其它屬性的值。 
以下場(chǎng)合應(yīng)使用只讀屬性的公共變量: 
·        屬性是自驗(yàn)證類(lèi)型。例如,如果一個(gè)不是 True 或 False 的值被賦給 Boolean 變量,則或者出錯(cuò),或者數(shù)據(jù)自動(dòng)轉(zhuǎn)換。
·        在數(shù)據(jù)類(lèi)型所支持的范圍內(nèi)的值都是有效的。象許多 Single 或 Double 類(lèi)型的屬性。
·        屬性是 String 數(shù)據(jù)類(lèi)型,并沒(méi)有大小或字符串取值的限制。
BTW: 不要僅僅為了避免函數(shù)調(diào)用的額外開(kāi)銷(xiāo)而用公共變量來(lái)實(shí)現(xiàn)一個(gè)屬性。其實(shí),由于類(lèi)型庫(kù)的要求,Visual Basic 在類(lèi)模塊中以任意方式將公共變量作為屬性過(guò)程對(duì)使用。

屬性和成員函數(shù)的選擇

在類(lèi)編寫(xiě)中,經(jīng)常會(huì)遇到選擇屬性還是成員函數(shù)實(shí)現(xiàn)的問(wèn)題,就此,我們對(duì)屬性和成員函數(shù)的選擇給出自己的判斷標(biāo)準(zhǔn)(僅供參考):
一般來(lái)說(shuō),屬性是對(duì)某個(gè)對(duì)象本身特征的描述,屬性是對(duì)向所擁有的,比如Name、Age、Height等等;而成員函數(shù)則用于執(zhí)行對(duì)象的某種行為/動(dòng)作,比如Move、Jump、Cook等。(此處是對(duì)于VB來(lái)說(shuō),CPP MS沒(méi)有類(lèi)似于VB屬性過(guò)程的東西,所以成員函數(shù)也用于設(shè)置屬性。)
不過(guò),有時(shí),就像人類(lèi)行為也存在一個(gè)邊界不清一樣,可能上述的方法不管用。那么,你可以根據(jù)自身的要求和條件或者說(shuō)癖好決定。
這里,還有最后一招,這招是上校的獨(dú)門(mén)絕技,不僅在此處適用,而且在任何學(xué)科,任何情況下皆適用。最大的好處在于你會(huì)無(wú)條件的服從自己~這招就是~~鐺~~鐺~~鐺~~擲——硬——幣。
回聲:)讓我送你去見(jiàn)毛主席吧~-_-#!

構(gòu)造函數(shù)與析構(gòu)函數(shù)

當(dāng)我們希望類(lèi)在被初始化時(shí),自動(dòng)的執(zhí)行一些操作。比如:為某個(gè)成員變量賦初始值。這時(shí)候,我們就需要構(gòu)造函數(shù)。當(dāng)然,這里的構(gòu)造函數(shù)(和下文的析構(gòu)函數(shù))同樣是CPP的叫法。
構(gòu)造函數(shù)表示為:
引用:
Private Sub Class_Initialize()

End Sub
BTW:大家可以先在左上端的對(duì)象下拉框內(nèi)選擇Class,然后在右邊選擇Initialize
比方說(shuō),我們希望在類(lèi)被初始化,m_strName自動(dòng)被賦予“IceBear”,只需:
引用:
Private Sub Class_Initialize()

   m_strName = "IceBear"

End Sub
說(shuō)完構(gòu)造函數(shù),咱再說(shuō)說(shuō)析構(gòu)函數(shù)。
析構(gòu)函數(shù)是類(lèi)被銷(xiāo)毀時(shí)要進(jìn)行的操作,通常用于清理、釋放等操作。他的函數(shù)名是:
引用:
Private Sub Class_Terminate()
析構(gòu)函數(shù)的用法和構(gòu)造函數(shù)相似,這里不再闡述。

缺憾

VB的類(lèi)的缺陷是比較多的,就像我們剛開(kāi)始了解的那樣,他不能夠繼承,而且用類(lèi)模塊其實(shí)是一件挺煩的事。相對(duì)于其他OOP語(yǔ)言來(lái)說(shuō),VB的類(lèi)還不支持真正的多態(tài)(VB是通過(guò)多重 ActiveX 接口來(lái)提供多態(tài)的),而友元效果也不太令人滿(mǎn)意。
還有一點(diǎn)比較重要,就是在類(lèi)模塊中是不能使用子類(lèi)化(SubClass)和鉤子(Hook)的。(除非你會(huì)用ASM寫(xiě)一個(gè)處理子程,然后掛接)

尾聲

至此,我們已經(jīng)了解了VB類(lèi)的大體使用方法,大家如果對(duì)此感興趣的話(huà),可以自己通過(guò)MSDN學(xué)習(xí):事件(events)、友元(Friend:VB中是這樣)等更高級(jí)的技術(shù)。
咳...咳...上校順便插段AD:
http://bbs.cfan.com.cn/viewthrea ... p%3Bfilter%3Ddigest
這里是上校自己寫(xiě)的托盤(pán)圖標(biāo)類(lèi),大家有興趣可以看看Source Code。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
VB編程基礎(chǔ)教程13–向過(guò)程傳遞參數(shù) | 異次元軟件世界
Excel VBA解讀(73):添加和刪除工作表——Add方法和Delete方法
全國(guó)計(jì)算機(jī)二級(jí)VB復(fù)習(xí)要點(diǎn)
VB基礎(chǔ)教程
VB數(shù)組
VB中Sub子過(guò)程與函數(shù)的調(diào)用
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服