Visual Basic 6.0 使用者可用的物件導向程式設計
更新:2007 年 11 月
Visual Basic 6.0 支援物件導向的語言項目,並支援散佈在程式庫中的物件;Visual Basic 2008 則會透過支援所有的語言屬性,擴充對物件導向程式設計的支援。
概念上的差異
下列各節將列出 Visual Basic 2008 中的物件導向功能,在適用時與 Visual Basic 6.0 實作相比較。每一個功能都提供連結,連接至詳細的 [說明] 頁,協助您深入了解。
存取層級
在 Visual Basic 6.0 中,關鍵字 Private、Friend、Public 和 Static 是用來設定已宣告項目的存取層級。
在 Visual Basic 2008 中,關鍵字 Private、Friend、Public 和 Static,加上新的關鍵字 Protected 和 Protected Friend 是用來設定已宣告項目的存取層級。已宣告項目的存取層級表示對項目進行存取的能力範圍,也就是代表哪些程式碼對項目具有讀或寫的權限。
如需詳細資訊,請參閱 Visual Basic 中的存取層級和 Visual Basic 中的範圍。
屬性
在 Visual Basic 6.0 中,內嵌屬性的有限支援是透過工具提供,例如 Visual Basic IDE 中的「程序屬性」。
在 Visual Basic 2008 中,Attribute 是描述性標籤,可用來為型別和型別成員陳述式加註,從而修改其意義或自訂其行為。例如,類別陳述式和類別方法陳述式可以用屬性加註。
您的應用程式及其他應用程式 (例如 Visual Basic 編譯器) 可以使用反映 (Reflection),存取屬性以判斷如何使用型別及型別成員。
屬性可以用來配合 Visual Basic 執行方面導向程式設計 (Aspect Oriented Programming,AOP)。Aspect 是橫切其商務邏輯之程式的一部分。換句話說,它必須完成程式,但不一定是程式撰寫目標的特定網域。將登入與持續性 (Persistence) 等方面獨立於商務邏輯以外,是 方面導向程式設計開發架構。
如需詳細資訊,請參閱 Visual Basic 中的屬性概觀、Visual Basic 所用的屬性和屬性的常見用法。
二進位碼相容性
在 Visual Basic 6.0 中,Binary Compatibility 選項允許您在編譯新版本時,自動保留從舊版元件識別的類別和介面。
在 Visual Basic 2008 中不支援 Binary Compatibility 選項,而是以屬性來滿足二進位碼相容性。這可讓您直接控制編譯元件中的資訊,例如類別識別項 (Class Identifier) 和介面識別項 (Interface Identifier)、虛擬表位移 (Offset) 及任何適當的 COM 屬性 (Attribute)。
如需詳細資訊,請參閱 Visual Basic 6.0 使用者可以進行的二進位碼相容性變更。
類別模組
在 Visual Basic 6.0 中,類別是在類別模組中加以定義。單一類別模組是儲存在有 .cls 副檔名之特殊類型的檔案中。
在 Visual Basic 2008 中,類別是在指定類別名稱和成員的 Class 陳述式中定義,Class 陳述式則儲存在原始程式檔 (Source File) 中。整個原始程式檔可以視為純文字。
多個 Class 陳述式以及其他型別陳述式可以儲存在單一的原始程式檔中,Visual Basic 不要求原始程式檔的名稱符合原始程式檔中定義的 Class 或型別。
如需詳細資訊,請參閱 Class 陳述式 (Visual Basic)。
類別建構函式方法
在 Visual Basic 6.0 中,名為 Class_Initialize 的類別 Initialize 事件處理常式是用來執行必須在建立物件時執行的程式碼。
Visual Basic 2008 會在類別中加入一個或多個建構函式,以執行程式碼並初始化變數。建構函式是名為 New 之類別中的方法。New 方法可以進行多載,以便在相同的類別陳述式中用 New 名稱提供多個建構函式。
如需詳細資訊,請參閱 New (Visual Basic) 或使用建構函式和解構函式。
類別解構函式方法
在 Visual Basic 6.0 中,Nothing 關鍵字是用來將物件變數與實際物件解除關聯。Set 陳述式是用來指派 Nothing 給物件變數。
在 Visual Basic 2008 中,對於應用程式所建立的大部分物件而言,您都可以依賴記憶體回收行程自動執行必要的記憶體管理工作。但是,Unmanaged 資源需要明確清除。最常見的 Unmanaged 資源類型就是包裝作業系統資源 (例如檔案控制代碼、視窗控制代碼或網路連接) 的物件。
建立封裝 Unmanaged 資源的物件時,建議您提供必要的程式碼,在公用 Dispose 方法中清除 Unmanaged 資源。您可以透過提供 Dispose 方法,讓物件的使用者在用完物件後,明確釋放出它所佔用的記憶體。
當您使用封裝 Unmanaged 資源的物件時,應留意 Dispose,並在必要時加以呼叫。
如需詳細資訊,請參閱清除 Unmanaged 資源或自動記憶體管理。
Class_Initialize
在 Visual Basic 6.0 中,Initialize 類別可以由 Class_Initialize 方法加以處理,以執行必須在建立物件時執行的程式碼。例如,類別資料變數的值可以進行初始化。
Visual Basic 2008 不支援 Initialize 事件和 Class_Initialize 處理常式。若要提供類別初始化,請加入一個或多個建構函式方法至您所定義的類別和結構中。
如需詳細資訊,請參閱 Visual Basic 6.0 使用者可以進行的 Class_Initialize 變更。
資料類別
在 Visual Basic 6.0 中,資料來源和複雜資料消費者 (Data Consumer) 是用來配合如 Microsoft SQL Server 資料庫之類的外部資料運作。資料來源類別是從外部來源提供資料。資料消費者可以繫結至資料的外部來源,例如 Data Source 類別。
在 Visual Basic 2008 中,資料來源、簡單資料消費者、複雜資料消費者,以及繫結類別都是用來配合外部和內部資料運作。
如需詳細資訊,請參閱資料繫結和 Windows Form。
預設屬性
在 Visual Basic 6.0 中,任何類別屬性都可以定義為類別的預設屬性。
在 Visual Basic 2008 中,類別或結構的預設成員只能是使用一個或多個引數的屬性。預設屬性成員是透過將 Default 關鍵字包含在類別或結構內的一個屬性宣告陳述式中加以定義。
如需詳細資訊,請參閱 Visual Basic 6.0 使用者可以進行的預設屬性變更。
委派
Visual Basic 6.0 不支援委派型別。
在 Visual Basic 2008 中,委派型別是一種物件導向方法指標的形式,可以允許方法透過參考方法的方式間接叫用。委派可用來連結事件處理常式,並將方法從一個方法傳遞至另一個方法。
委派可以用來實作非同步設計模式。例如,程式可以使用非同步委派呼叫方法,在主程式繼續執行時列舉大型清單。完成列舉之後,進行回呼,程式即將它定址。
如需詳細資訊,請參閱 Visual Basic 中的委派或 HOW TO:在 Visual Basic 中將程序傳遞至其他程序。
錯誤處理
在 Visual Basic 6.0 中,On Error 陳述式是用來進行未結構化的例外處理。
Visual Basic 2008 支援未結構化和結構化的例外處理。結構化例外處理 (Structured Exception Handling) 是包含例外狀況、隔離程式碼區塊及篩選條件的控制項結構,用以建立例外處理機制。
如需詳細資訊,請參閱 Visual Basic 的結構化例外處理方式或選擇何時使用結構化和非結構化例外處理。
事件
在 Visual Basic 6.0 中,Event、RaiseEvent 和 WithEvents 關鍵字是用來宣告、引發和處理事件。
在 Visual Basic 2008 中,Event、RaiseEvent 和 WithEvents 關鍵字加上新的 AddHandler、RemoveHandler 和 Handles 關鍵字是用來宣告、引發和處理事件。
AddHandler 和 RemoveHandler 關鍵字允許您動態地加入、移除及變更與事件相關聯的事件處理常式。
Handles 關鍵字允許您在方法上定義 Handles 類別。Handles 宣告程序處理指定的事件。
Events in the .NET Framework 中的事件是以委派模型為基礎。委派模型是以物件導向觀察器設計模型為基礎。
如需詳細資訊,請參閱 HOW TO:撰寫事件處理常式。
泛型
Visual Basic 6.0 不支援泛型型別。
在 Visual Basic 2008 中,泛型是用來在 Visual Basic 程式中實作參數多型 (Polymorphism)。泛型程式碼是在不提及任何特定型別下撰寫,因此可以配合任何數目的新型別穿透使用。
Visual Basic 2008 支援泛型類別、結構、介面、程序和委派的型別參數。對應的型別引數會在編譯時期指定泛型型別之其中一個項目的資料型別。
如需詳細資訊,請參閱 Visual Basic 中的泛型型別。
全域類別
在 Visual Basic 6.0 中,類別 Instancing 屬性的值決定類別是否為私用,也就是,只用於一個元件之內,或可供其他應用程式使用。它也決定其他應用程式建立類別執行個體的方式,以及其他應用程式呼叫類別成員的方式。
Visual Basic 2008 不再支援 Instancing 屬性。
您可以套用 Public 關鍵字至組件中的類別陳述式,以公開該組件中的類別給其他組件。
您可以參考如類別程式庫等外部組件,讓應用程式中的程式碼能夠使用該類別程式庫中的 Public 類別。
您可以使用 Imports 關鍵字,從參考的專案和組件匯入命名空間。Imports 關鍵字也可以匯入在陳述式所出現檔案之專案中定義的命名空間名稱。
您可以套用 Shared 關鍵字至類別和結構的欄位、屬性和方法成員,以實作共用成員。共用成員是指類別或結構的所有執行個體共用的屬性、程序和欄位。毋需將類別執行個體化就可以存取類別的共用成員。
如需詳細資訊,請參閱 Visual Basic 中的存取層級、參考和 Imports 陳述式或 Visual Basic 的共用成員。
實作繼承
Visual Basic 6.0 不支援實作繼承。
在 Visual Basic 2008 中,您可以透過實作 (Implementation) 繼承實作 (Implement) 臨機操作多型。這樣可以讓您定義在執行階段由用戶端程式碼交替使用但具有不同功能 (然而名稱完全相同) 之方法或屬性的類別。
您可以定義做為衍生類別之基礎的基底類別。衍生類別繼承並可擴充基底類別的屬性 (Attribute)、方法及事件。衍生類別也可用新的實作來覆寫繼承。
介面繼承
Visual Basic 6.0 透過多個 ActiveX 介面提供多型。在組成 ActiveX 規格之基礎結構元件的物件模型 (Component Object Model,COM) 中,多個介面可以讓軟體元件系統 (COM) 在毋需中斷現有程式碼下繼續發展。
在 Visual Basic 2008 中,您可以用 .NET Framework 的 Interface 關鍵字實作臨機操作多型。
多個類別可以實作相同的 Interface,而單一類別可以實作一個或多個介面。介面基本上是類別必須回應之方式的定義。介面會定義類別需要實作的方法、屬性和事件,以及各成員必須接收或傳回的參數型別,但是這些成員的明確實作則由實作類別來決定。
多重介面的優點在於,允許軟體元件的系統逐步發展而不需要破壞現有的程式碼。
如需詳細資訊,請參閱 介面架構多型或 HOW TO:建立和實作介面。
方法:ByVal 和 ByRef 參數
在 Visual Basic 6.0 中,引數是由值或參考傳遞給方法。除非方法參數是明確地由 ByVal 或 ByRef 關鍵字指定,否則引數都是由參考 (ByRef) 隱含傳遞。
在 Visual Basic 2008 中,引數是透過傳值 (By Value) 或傳址 (By Reference) 方式傳遞給方法。除非方法參數是明確地由 ByVal 或 ByRef 關鍵字指定,否則引數都是由值 (ByVal) 隱含傳遞。
如需詳細資訊,請參閱以傳值和傳址方式傳遞引數。
方法:多載化
Visual Basic 6.0 不支援方法多載。
在 Visual Basic 2008 中,Method 多載是用來在 Visual Basic 程式中實作臨機操作多型。在類別中定義多個版本的方法時,會多載方法。多載的版本在參數和傳回型別上有所不同。
如需詳細資訊,請參閱多載屬性和方法和Visual Basic 如何提供多型。
方法:覆寫
在 Visual Basic 6.0 中,方法不能加以覆寫。
在 Visual Basic 2008 中,您可以使用 Overrides 關鍵字覆寫衍生類別中的方法,以便從衍生的基底類別中提供方法的不同實作。
如需詳細資訊,請參閱覆寫屬性及方法。
方法:傳回結果
在 Visual Basic 6.0 中,Function 方法的名稱是用來做為變數的名稱,以傳回 Function 方法的結果。
在 Visual Basic 2008 中,您可以使用 Return 關鍵字傳回 Function 方法的結果。
使用 Return 傳回控制項給呼叫 Sub、Function 或 Property 方法的程式碼。
如需詳細資訊,請參閱 Return 陳述式 (Visual Basic)。
My
在 Visual Basic 2008 中,新的 My 功能可以透過提供進入點 (Entry Point) 給經常使用的 .NET Framework 類別和函式,以 Visual Basic 迅速進行物件導向的程式設計。My 可提供新的高階 .NET Framework 類別,將相關聯的功能集結收入以工作為基礎的 API。
如需詳細資訊,請參閱使用 My 進行開發。
MyBase、MyClass 和 Me 關鍵字
在 Visual Basic 6.0 中,Me 關鍵字的行為有如隱含宣告的變數。當類別有多個執行個體時,Me 會提供方法,以參考程式碼在其中執行的特定類別執行個體。
在 Visual Basic 2008 中,MyBase 關鍵字可提供方法,參考目前類別執行個體的基底類別。
MyClass 關鍵字提供方法,參考目前類別執行個體而毋需覆寫。
Me 關鍵字提供方法,參考目前程式碼正在其中執行之特定類別執行個體或結構。
如需詳細資訊,請參閱 Visual Basic 中的 Me、My、MyBase 和 MyClass。
New 關鍵字
在 Visual Basic 6.0 中,不當使用 New 關鍵字可能會導致一些不尋常的重新初始化行為,而導致錯誤並過度使用記憶體。
在 Visual Basic 2008 中,New 關鍵字只是為物件配置空間,而不會導致不尋常的重新初始化行為。
在宣告陳述式 (Declaration Statement) 或指派陳述式中使用 New 子句。執行該陳述式時,它會呼叫所指定類別的建構函式方法,傳遞 New 子句中提供的任何引數。這表示您可以在將物件個體化時,強制資料條件約束。
類別有一個或多個建構函式。建構函式是名為 New 方法中的方法。多個建構函式是由多載類別中的 New 方法加以定義。多載建構函式方法是描述為參數化的建構函式。
如需詳細資訊,請參閱 New (Visual Basic)。
物件存留期
在 Visual Basic 6.0 中,物件存留期具有決定性;所有物件執行個體都會維護一個參考計數。釋放執行個體的最後參考時,計數會變成零,而且物件會立即加以終止。
在 Visual Basic 2008 中,物件存留期不具有決定性;釋放最後一項參考時不一定會呼叫解構函式 (Destructor)。這是因為 Common Language Runtime 會維護一個參考樹狀結構,而非個別的參考計數。
記憶體回收行程會持續在背景中追蹤參考樹狀結構。如果它發現物件或物件群組並沒有參考任何目前執行中的程式碼,便會呼叫所有此類物件的解構函式。
要預測此解構的順序或記憶體回收行程追蹤參考樹狀結構所需花費的時間是不可能的事。
如需詳細資訊,請參閱 Visual Basic 中的存留期或物件存留期:物件的建立和終結。
運算子多載
Visual Basic 6.0 不支援運算子多載。
在 Visual Basic 2008 中,針對使用者定義的類別或結構,運算子多載允許定義標準運算子的行為 (例如 *、<> 或 And)。
如需詳細資訊,請參閱 HOW TO:定義轉換運算子。
Option Strict
在 Visual Basic 6.0 中,執行階段是使用寬鬆型別檢查。
在 Visual Basic 2008 中,您可以使用 OPTION STRICT ON 陳述式,在設計階段啟用嚴格型別檢查,而不是在執行階段使用寬鬆型別檢查。預設為使用 OPTION STRICT OFF。
在資料型別之間轉換時,Visual Basic 編譯器能夠在嚴格或寬鬆型別語意下作業。如果已啟用嚴格型別語意 (OPTION STRICT ON),則只有擴大轉換允許為隱含,而縮小轉換就必須是明確的。在寬鬆型別語意 (OPTION STRICT OFF) 的情況下,您可以嘗試進行所有隱含的擴大和縮小轉換。型別語意適用於所有資料型別之間的轉換,包括物件型別。
如需詳細資訊,請參閱 Visual Basic 中的型別檢查。
屬性語法
在 Visual Basic 6.0 中,是使用 Property Get、Property Let 和 Property Set 陳述式,取得和設定屬性值。
Visual Basic 2008 會使用統一的屬性宣告語法,其中包含取得及設定屬性值的程序。這麼做可保證 Property 屬性 (Attribute) 的一致性,如存取層級和多載。
如需詳細資訊,請參閱 Visual Basic 6.0 使用者可以進行的屬性變更。
公用介面
在 Visual Basic 6.0 中,類別的公用介面即其公用成員組。
在 Visual Basic 2008 中,類別的公用介面即其公用成員組,但可使用抽象類別在 Visual Basic 程式中實作子型別多型。
抽象類別類似 .NET Framework 的 Interface。抽象類別是特別設計只做為衍生類別的基底類別之用。抽象類別經常用來表示抽象觀念或實體。
抽象類別本身不能具現化,必須進行繼承。部分或全部類別可能未實作,它是由繼承的類別提供該實作。已實作的成員仍然可加以覆寫,而繼承的類別仍然可以實作其他介面或其他功能。
如需詳細資訊,請參閱 MustInherit。
唯讀屬性
在 Visual Basic 6.0 中,在 Property 程序中排除 Set 方法會建立唯讀屬性。
在 Visual Basic 2008 中,您必須將 ReadOnly 關鍵字套用至屬性,同時排除屬性 Set 子句,以便讓屬性為唯讀。
您也可以套用 ReadOnly 關鍵字至欄位,讓它成為唯讀。
如需詳細資訊,請參閱 ReadOnly (Visual Basic)。
反映
Visual Basic 6.0 不支援反映。
在 Visual Basic 2008 中,可以在執行階段使用 .NET Framework 類別程式庫 System.Reflection 命名空間中的類別,取得有關類別、介面和實值型別 (Value Type) 之類的資訊,並建立型別執行個體加以叫用並存取。
如需詳細資訊,請參閱Visual Studio 中的 Reflection 命名空間。
共用類別和結構成員
在 Visual Basic 2008 中,新的 Shared 關鍵字可以套用至 Property、Sub、Dim、Function、Operator 和 Event 陳述式,以便與類別或結構的所有執行個體共用。毋需將類別執行個體化就可以存取類別的共用成員。
您可以透過類別的名稱存取共用的成員,而不是透過類別的執行個體。
如需詳細資訊,請參閱 Visual Basic 的共用成員。
原始程式檔
在 Visual Basic 2008 中,程式是由一個或多個原始程式檔組成。原始程式檔是儲存在具有 .vb 副檔名的特殊檔案類型中。類別、結構、介面、列舉和委派等型別的型別陳述式,以及標準模組的型別陳述式,都儲存在程式的原始程式檔案中。Visual Basic 不會將原始程式檔限於僅定義一個型別,也不會要求原始程式檔的名稱與原始程式檔中所定義的型別相符。
部分型別陳述式允許類別或結構跨多個原始程式檔定義。編譯多重原始程式檔的程式時,所有原始程式檔都會同時進行處理,好像所有原始程式檔在處理之前都串連成一個檔案。
如需詳細資訊,請參閱 Visual Basic 程式的結構或 Partial (Visual Basic)。
使用者定義型別
在 Visual Basic 6.0 中,Type 陳述式是用來將幾個不同型別的變數結合成一個使用者定義型別或 UDT。
在 Visual Basic 2008 中,Structure 和 Enum 陳述式是用來定義使用者定義的實值型別。
使用 Class、Interface 和 Delegate 陳述式,以定義使用者定義參考型別。
如需詳細資訊,請參閱結構:您自己的資料型別。
變數宣告
在 Visual Basic 6.0 中,您可以在相同陳述式中宣告不同型別的變數。如果不在陳述式中指定變數的資料型别,即預設為 Variant。
在 Visual Basic 2008 中,毋需陳述式中各變數的資料型別,就可以宣告相同資料型別的多重變數。
如需詳細資訊,請參閱 Visual Basic 中的變數宣告。
升級注意事項
當 Visual Basic 6.0 應用程式升級至 Visual Basic 2008 時,物件導向的程式碼建構會以最有利的方式轉換成最接近的 Visual Basic 2008 對等用法。產生的程式碼不應視為在 Visual Basic 2008 中進行物件導向程式設計的範例。
如果您想要擴充已升級的應用程式,以便使用 Visual Basic 2008 物件導向建構,可能首先要修改已升級的程式碼。下列各項應該可以協助您開始著手。
Visual Basic 6.0 使用者可用的類別
類別是物件導向應用程式的建置組塊。HOW TO:將自訂集合轉換為 Visual Basic 具型別集合
Visual Basic 2008 提供數個選項,用於從 Visual Basic 6.0 自訂集合建立具型別的類別。HOW TO:將使用者定義的 Type 轉換為 Visual Basic 的 Structure
Visual Basic 6.0 的 Type 陳述式已升級為 Visual Basic 2008 的 Structure 陳述式。HOW TO:將實作程式碼轉換為繼承的新表單
較新版的 Visual Basic 會使用 Implements 陳述式和 Inherits 陳述式,來提供兩種繼承型別。