VB.NET可以創建處理代碼,這些處理代碼是運行在.NET框架上的。所有的管理代碼可以和其它類型的處理代碼交互作用,而不管我們是用什麼編程語言來創建這些組件的。這就意味著我們可以在一種編程語言上創建一個類,然後應用到另外的編程語言中,當然也包括繼承。這正式交叉語言混繼承的混合編程機理。
實際上,現在有許多程序涉及人員已經在應用這個技術了。許多的.NET系統類庫是在C#上編寫的,而我們在VB.NET上編寫程序的時候,可以繼承這些類作為基類。
創建VB.NET基類
舉個例子,我們可以在VB.NET創建一個類庫工程取名為vblib並且增加一個簡單的類為Parent,代碼如下:
1Public Class ParentClass Parent
2 Public Sub DoSomething()Sub DoSomething()
3 MsgBox(Parent DoSomething, MsgBoxStyle.Information, Parent)
4 End Sub
5End Class
利用這個基類我們可以在C#上創建一個子類。
創建C#子類
我們可以增加一個新類庫工程,具體做法是使用菜單File(文件)->AddProject(增加工程)並將它命名為cslib。接著通過選擇菜單Project(工程)->AddReference(增加引用)來增加一個引用到vblib工程。
當我們在IDE中直接引用這個工程的時候,我們不需要VB.NET的源代碼。相反地,我們可以先創建vblib工程,再創建一個組件,接著從C#工程中引用這個組件來得到訪問基類的目的,代碼如下:
1namespace cslib
2{
3 using System.WinForms;
4 using vblib;
5
6 public class csclass : Parent
7 {
8 public csclass()
9 {
10 Messagebox.Show(csclass constructor);
11 }
12 }
13}
以上這個C#代碼共享了VB.NET中的代碼。但是,C#的語法很大程度上來自C和C++語言,所以編程會變得復雜一點。所有的代碼語句的最後要以分號(;)結束,並且利用左右括號({和})來定義一個塊結構。而在VB.NET中定義一個塊結構是利用Sub...EndSub語句,這正是VB.NET和C#語法上的一個差別,所以在利用VB.NET和C#混合編程的時候一定要注意到語法的差別。
我們還是仔細體會體會上面的代碼吧。代碼的第一行是為文件定義了名空間(namespace)。在C#中所有的名空間是顯式定義在每一個代碼模塊中的:
1 Namespace cslib 在C#中的using關鍵字等價於在VB.NET中的Imports關鍵字。因為我們要使用System.WinForms和來自vblib的名空間,所以我們使用以下的語句來引入這些名空間:
1 Using System.WinForms;
2 Using vblib; 代碼接下去的一行是聲明我們要創建的類以及表明這個類是Parent的一個子類:
1 Public class csclass:Parent 在C#中一個子類是通過定義一個類來定義的,具體語法是類名之後加冒號(:),然後再加基類。這條語句等價於如下VB.NET的代碼:
1 Public Class csclass
2 Inherits Parent
在VB.NET中構造函數是通過使用保留的方法New來創建的。而在C#中構造函數是使用類名作為方法的名字來創建的,例如:
1public csclass()
2{
3 Messagebox.Show(csclass constructor);
4}
在C#中,大括號({和})定義一個塊結構,而在這個塊結構中我們可以放置方法的代碼。在這個例子中的方法很簡單,只是顯示一個對話框來指示構造函數被調用了而已。至此我們就可以為新工程創建客戶代碼了。
創建客戶應用程序
首先可以使用菜單File(文件)->AddProject(增加工程)來增加一個新的VB.NET的Windows應用程序工程。在這個新工程可以選擇菜單項Project(工程)->AddReference(增加引用)來為cslib工程增加一個引用。在工程中點擊鼠標右鍵並從彈出的菜單中選擇SetAsStartupProject選項,這樣做的目的是當你按下F5快捷鍵的時候工程就運行。
這裡值得注意的是,vblib工程沒有任何的引用,這是因為我們沒有直接使用來自組件的任何代碼。所有的客戶應用程序所關心的是cslib工程。
當我們在IDE中直接引用cslib工程的時候,我們不需要C#代碼。相反地,我們可以先創建cslib工程,再創建一個組件,接著引用來自客戶工程的組件以訪問我們的測試C#類。接著我們還要增加一個按鈕到窗體中,並為該按鈕編寫以下的代碼:
1Protected Sub Button1_Click()Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
2 Dim obj As New cslib.csclass()
3 obj.DoSomething()
4End Sub
雖然創建一個VB.NET的子類也是沒什麼差別的,但是在本例子中我們是使用了不同的編程語言來實現的。其中的差別大家仔細體會,相信會對你有所幫助。
好了,當我們運行應用程序並點擊按鈕的時候,我們就可以看到一個對話框,對話框上面顯示了我們所調用的csclass的構造函數;以及另外一個對話框,其上面顯示了我們所調用的VB.NET基類的DoSomething方法。