OOp(Object-Oriented-Programming)是相對於結構化程序設計(Structure Programming)而言的,表示采用面向對象的思想進行軟件的編制。它是當今最流行的編程模式。“面向對象技術”追求的是軟件系統對現實世界的直接模擬,盡量實現將現實世界中的事物直接映射到軟件系統的解空間。
對象是一些把屬性(Properties)、字段(fileds)、方法(methods)、事件(event)作為一個單獨的數據類型進行處理的實體。編程還需要對象滿足和支持下面三個特性:封裝性、繼承性和多態性。對象可以使用戶只需首先聲明一些變量和方法以後,就可以在需要使用的時候,調用一個它的對象進行重用。
在Visual Basic的早期版本中(1.0-3.0)並沒有包括面向對象的功能,從vb 4.0開始,用戶可以象建立一個新的窗體那樣建立一個新的類,並把它作為一個新的對象,類在Vb.net中是一個非常重要的部分,幾乎所有正規的程序都包括了一個或者幾個類,在vb.net中,類模塊和窗體的區別已經不存在了,幾乎所有的程序都是由類組成的,為了更好的使用這些類,它們被按照不同的功能分中不同的功能類庫裡。
vb.net在聲明、構造以及執行類上比vb 6.0有很大的變化,同樣在對象的處理上也有不小的改變。這些改變影響了定義一個對象、引用和取消引用對象以及使用捆綁技術的方法。
vb.net沒有使用CreateObject語句來創建對象。CreateObject是Visual Basic與COM密切相關的一個產物。因為vb.net不再使用COM,所以從Vb.net開始就不再使用CreateObject。vb.net使用New語句來創建對象。用戶可以在代碼的任何地方使用New。下面就是一個創建一個變量並且在類的一個實例中創建一個對象的實例:
Dim obj As TheClass
obj=New TheClass()
可以簡化上面的語句:
Dim obj As New TheClass()
在Visual Basic 6.0中,以上的兩段語句會存在一些問題,但是在vb.net中上瑞的兩段語句之間沒有區別,只是第二段語句縮短了而已。如果用戶在一個模塊中聲明一個變量,那個變量就只有在該模塊中才有效。在許多情況下,用戶想在方法的作用域中聲明一個變量,或者想在模塊(比如Try...End或者loop循環結構)中創建一個類的實例。在這樣的情況下,用實例化來組合聲明有些不妥。
上面的語句為用戶定義了一個變量並實例化了一個類。這條語句可能在處理繼承或者多個界面的時候會更有用。用戶可以聲明變量為其中一種類型並且基於要執行界面的類來實例化對象:
Dim obj As MyInterface=New Theclass()
也可以同時利用復雜的語句。假如現在有個需要對象引用的方法,就可以這樣來實例化對象:
DoSomething(New TheClass())
以上的語句是調用DoSomething方法並且傳遞Theclass的一個新的實例作為參數。這個新的對象就只有存在於這個方法的調用事件內,即當方法完成之後,這個對象就自動被取消引用。
這裡還得注意一下,取消引用一個對象不是意味著馬上終止這個對象。這一點前面的介紹中有過解釋。對象只有在.NEt的垃圾收集處理程序的時候才將它們從內存清除掉。
下面的例子可能更復雜。不是利用一個對象引用,這裡的方法需要一個字符串。用戶可以從一個方法提供一個字符串數值到對象中來實例化對象並調用方法:
DoSomething(New TheClass().GetStringData())
很顯然,用戶可能需要仔細觀察一下這條語句的可讀性。語句的壓縮往往降低了可讀性,這一點是應該注意到的。
當處理對象的時候,這裡沒有使用Set語句。在vb 6.0中,處理對象引用的時候,用戶不得不使用Set命令處理來自其他數據類型的對象。而在vb.net中來自其他數據類型的對象是采用不同的方法來處理的,這裡可以使用直接的參數來處理對象,就象處理整型或者字符型數據類型。這個Set命令在Vb.net中不再有效。
在vb 6.0中,用戶可以通過設置對象引用為Nothing(空)來取消引用對象。這點和vb.net中的處理方法是一樣的。
Dim obj As TheClass
obj=New TheClass()
obj=Nothing
但是在vb.net中這條語句有不同的效果。因為vb.net不是使用引用計算來終止對象,而是依靠垃圾收集機理。而在vb 6.0中,當沒有變量訪問對象的引用,這個對象就被終止。在vb.net中,以下這樣看法是錯誤的:當垃圾收集處理程序發現對象沒有被引用它就被終止。正確的應該是,是最後一個引用被移除之後的一段時間後才將對象從內存中清除。但是這並沒有清除被取消對象的數值。如果用戶有一個長時間運行的算法,那麼最好在處理程序中顯示式地取消引用這個對象,這樣就可以在可能的情況下由垃圾收集程序清除它們。只要代碼保留了對象的引用,那麼對象就會保持在內存中而不會被垃圾收集程序清除。
vb.net可以創建處理代碼,這些處理代碼是運行在.NET框架上的。所有的管理代碼可以和其他類型的處理代碼交互作用,而不管用戶是用什麼編程語言來創建這些組件的。這就意味著用戶可以在一種編程語言上創建一個類,然後應用到另外的編程語言中,當然也包括繼承。這正是交叉語言混繼承的混合編程機理。實際上,現在有許多程序設計人員已經在應用這個技術了。許多的.NEt系統類庫是在C#上編寫的,而用戶在vb.net上編寫程序的時候,可以繼承這些類作為基類。
舉個例子,在vb.net創建一個類庫工程取名為vblib,並且增加一個簡單的類為Parent,代碼如下:
Public Class Parent
Public Sub DoSomething()
MsgBox(Parent Dosomething,MsgBoxStyle.Information.Parent)
End Sub
End Class
可能許多程序設計人員還不知道vb.net支持Windows窗體的可視化繼承。可視化繼承,就是說用戶可以創建一個Windows窗體,然後可以繼承這個窗體使得其他窗體具有與該窗體相同的版面布置、控件和行為。用戶也可以使用繼承來創建自己的Windows控件。比如,用戶可以創建一個性能提高了的TextBox(文本框)來實現數據輸入的特殊的有效性校驗。具體的做法是:通過繼承創建一個由原始文本框控件類繼承而來的子類,並進行適當的修改以提高文本框的性能,使之可以實現對數據輸入的有效性校驗。這一點跟Web表單控件是相同的,Web表單控件可以由一個已經存在的Web表單控件來創建一個子類。用戶的子類可以重載已有的函數或者增加一些新的函數。
Vb.net不僅提供了繼承,而且還提供了其他許多重要的新特性。vb.net改進了創建和處理多界面的方法,使得用戶可以更容易的使用它們。另外,vb.net支持事件作為界面的一部分,使得現在可以在界面上表達所有的元素:方法、屬性、事件。此外,在vb.net中終止對象不是通過引用計數來實現,而是利用“垃圾收集”程序來將對象從內存中清除。總而言之,vb.net比起Visual Basic以前的版本變說,其面向對象的能力大大增加了,而且vb.net也保留了低版本的絕大多數的特性。
關於面向對象的詳細理論請參閱後續章節:vb.net的OOP結構。