VB.NET中的類

來源:互聯網
上載者:User
我在以前的文章裡曾經提到:VB.NET的出現使得VB6在類的概念及其操作上發生了巨大的變化。現在就讓我們進到這些變化中來進行更深入的探討。首先讓我們看看類到底意味著什麼。

不妨假設我把你帶回到了學院,現在你走進一個教室,我要求你解釋一下什麼是類(class),你可能會這樣回答:“一組學生形成一個班(class)。”呵呵,如果這樣回答,你真是歪打正著了:沒錯,在這裡,組就是最關鍵的詞。用物件導向的編程思想來看,類就是儲存資料同時給一組相關代碼賦予協調功能的方式。類是物件導向編程的核心。

.NET賦予類的新面目
VB6和VB.NET在類的用法上有一個首要的顯著差別,那就是後者不再採用Set關鍵詞了。除此以外,在代碼中定義類的方法也有所改變。這些變動不僅會直接影響你編寫的代碼而且更會改變你組織源檔案的方式。

在VB6下,每個類都必須在單個源檔案內增加和定義。而在VB.NET下就不是這樣了:類以代碼塊的形式定義,如下所示:

Public Class MyClass
    '在這裡編寫類的成員代碼!
End Class

面對如此革命性的變化,有些人可能會急得嘴角發泡,而大多數人卻可能並不在乎或不明白用代碼塊定義類到底用什麼用。說真的,這全看你的口味。有些人喜歡而且希望一個檔案中就只定義一個類,而另一些人則更願意邏輯地組織他們的類。例如,如果你有一個product類,同時又有了一個對應的products collection類,那麼你完全可以把它們放在同一檔案裡以便更好地組織源檔案。

類的構造和析構——舊貌換新顏
當你的代碼在建立一個類的執行個體時會調用該類的一個特殊方法:構造器(constructor)。同樣的,在類被破壞的時候則會調用析構器(destructor)方法。在大多數物件導向語言裡牽扯到類的構造和析構時通常都採用了以上兩個一般術語而非具體編碼時的成員名。我則喜歡採用術語“structors”來引用構造和析構。在VB6語言裡,具體的“structors”是Class_Initialize和Class_Terminate。在VB.NET下,Class_Initialize方法則被重新命名為New,而Class_Terminate則成了Finalize。

按照VB6對類構造器的實現限制,程式員不得給該方法添加參數。然而,VB.NET中則對構造器方法提供了參數支援。在VB.NET下,你現在可以隨意地把參數添加到這個方法中來,甚至可以重載該方法。

參數化的構造器如何靈活地建立類呢?舉個例子,假設有一個ADO Connection類。用VB6語言的話,你首先得把該類執行個體化,然後在代碼中用ConnectionString屬性定義串連。要用VB.NET的話,這個類的構造器就被參數化和重載了,這樣,在程式員給對象執行個體化時就可以給它傳遞一個連接字串,這樣你就不必關心代碼內如何設定以後的串連了。當然,你完全可以按老辦法做:什麼參數都不傳遞,以後在代碼中設定連接字串。

域和屬性
很多人在對屬性的認識上產生了一些混亂的概念。其實屬性這個東西絕非人們想象的那麼複雜。讓我們回到最基礎的概念層次上來討論屬性:所謂屬性其實就是暴露了讀/寫介面的類的內部所包含的一塊資料。按照這個定義,你可能會認為你能在類中聲明一個公開變數然後把它稱為一個屬性。當然,這種假設也不是沒有一點道理,不過,類的公開變數所對應的技術術語應該是field(域)。域和屬性之間的關鍵差別在於介面的包含性質上。現在暫時不對這一差別做具體解釋咱們先明白其文法用途即可。

在VB6中,屬性由Let、Get和Set程式來定義和操作。而在VB.NET中文法就變了。屬性被組織為單個Property代碼塊,其中針對屬性的寫(Set)和讀(Get)操作設定了子代碼塊。這一程式起到了類的私人變數之上的抽象層作用。大多數人習慣於採用類似公開變數的方式命名這些私人變數,在它們前面加上小寫首碼字母m或者加上底線區分所關聯的屬性(m首碼是VB6中繼承下來的,意思是:“模組層級變數”)。舉一個例子:

Private _ContactName As String
Public Property ContactName()
Get
Return _ContactName
End Get
Set(ByVal Value)
_ContactName = Value
End Set
End Property

我給一個假定的類ContactName建立了一個屬性。為了支援該屬性,我需要在類裡設定一個變數儲存其實際值。ContactName私人變數就是完成這一功能的。只要我擷取或者設定了該屬性,我就等於間接地使用了該值。

那麼,為什麼這麼做就比使用域更好一些呢?主要的原因是,如果採用域,那麼就無法控制寫到變數中的資料。比方說,有的人卻偏偏要在整數域中置入字串或者給唯讀域賦值。在採用屬性的情況下,你可以在Set程式中增加邏輯來保證賦值的有效性。你甚至可以完全省略Set代碼塊把屬性設定為唯讀。

屬性真奇妙
最後,.NET還向我們提供了就被稱為屬性的內容。如果某個類標記為屬性,那麼它就被賦予一些特別有意思的專門功能。比如以下的Serializable屬性。

<Serializable()>
Public Class MyClass
'該類可以序列化!
End Class

把以上的類標記為屬性之後,不論其處於什麼狀態我都可以擷取其執行個體並寫出磁碟。在一些任何時候,我就可以對該類去序列化,就好象它始終儲存在記憶體中一樣。.NET架構提供了大量的屬性,你甚至可以自己用VB.NET建立屬性。

繼承
正如你看到的那樣,VB.NET的類在概念和工作方式上相比VB6.0已經發生了重要的變化。在下一篇文章裡,我還會繼續對這些變化進行討論,主要是闡述類的繼承問題。大多數VB程式員都可能瞭解繼承,但他們卻幾乎從來沒有使用過它。我將具體解釋下繼承的重要性以及在什麼情況下採用繼承


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。