基于組件的.NET軟件開發(2)
2024-07-10 13:07:40
供稿:網友
 
組件的繼承
 前面實現的將c#組件組合進vb工程中只是牛刀小試,現在我們來實現混合語言的面向對象編程(oop),首先,我們來嘗試一下混合語言組件的繼承。
 新建一個vb類庫工程vbcomponent,在工程中按上面的方法添加對csharpclass.dll組件的引用,然后組件中增加一個新類:extendsfromcsharp,它繼承自c#類csharpclass,extendsfromcsharp類提供一個add(x,y)方法,將兩數相加,用uml表示如圖4:
圖 4 從c#類繼承而來的vb類
具體代碼如下:
 
imports csharpclassnamespace.csharpclass
'繼承自c#組件中的類csharpclass
public class extendsfromcsharp
 inherits csharpclassnamespace.csharpclass
 public function add(byval x as integer, byval y as integer) as long
 return x + y
 end function
end class
 
 編譯生成vbcomponent.dll組件(至于如何使用和測試這個類,就不用我多說了吧?)。
 現在,vbcomponent組件中的extendsfromcsharp類將擁有兩個方法:saysomething來自c#基類csharpclass,而add()函數則由vb實現。你創建的extendsfromcsharp類對象居然組合了兩種不同語言開發的功能,你甚至不知道這些方法和函數是由哪種語言開發的,是不是很神奇?
 讓我們稍微休息一會,進行一個小結:
 現在我們已掌握了從現成的組件中派生新類的方法,這就是說,我們可以建立自己的組件庫,并在合適的時候動態地擴展它,這種擴展是跨語言的。
 在vs.net中使用混合語言組件時,當所使用的組件修改過后,注意需要動態地更新工程引用。方法是重新生成解決方案,或者是刪除原有引用后再重新加入工程。
 由于組件間相互繼承,這就造成了組件庫之間的依賴性(比如vbcomponent.dll組件就依賴于csharpclass.dll),因此,在實際項目開發中,任何一個項目小組成員所開發的組件庫,都要求在文檔中聲明其組件庫依賴性。另外,在系統開發完成部署到用戶計算機上時,相互依賴的組件庫必須綁在一起同時復制到用戶計算機上,不能只提供一個。
 
 下面,讓我們走得更遠一些,在組件間實現多態!
組件間的多態調用
 我們來實現一個“經典”的多態例子,它說明以下事實:圓和矩形都是幾何圖形,都可以求面積。
 繼續上面的例子,在c# 工程中選定原先的csharpclass.cs文件,在類csharpclass之外,輸入以下代碼:
 
 public interface imyshape
 {
 double area();
 }
 public class csharprect :imyshape
 {
 public float width;
 public float height;
 
 public double area()
 {
 return width*height;
 }
 }
 
 很明顯,在這里我們定義了一個接口imyshape,類csharprect實現了這個接口,它對接口所定義的求面積的函數double area()提供了自己的實現:
 矩形面積=長*寬
 編譯生成解決方案,csharpclass.dll得到更新。
 打開vbcomponent工程,注意到刷新此工程對csharpclass.dll的引用,檢查方法是在選菜單:視圖à對象瀏覽器,查看csharpclass是否體現了新的更改,如5圖所示:
圖 5 檢查組件是否更新
 新建一個類文件vbcircle.vb,輸入以下代碼:
 
public class vbcircle
 implements csharpclassnamespace.imyshape
 
 private _radius as single
 
 property radius() as single
 get
 radius = _radius
 end get
 set(byval value as single)
 _radius = value
 end set
 end property
 
 public sub new()
 _radius = 0
 end sub
 
 public function area() as double implements csharpclassnamespace.imyshape.area
 return system.math.pi * _radius * _radius
 end function
end class
 
 編譯,生成vbcomponent.dll。
 現在,我們就實現了基于組件的以下面向對象系統設計:
 
 
 新建一個使用vb的windows應用程序,在工程中加入對以上兩個組件庫的引用,往窗體上加入一個按鈕,在其click事件中書寫以下代碼:
 
private sub button_click(…) handles button6.click
 dim vbobj as new vbcomponent.vbcircle()
 vbobj.radius =10
 dim csharpobj as new csharpclassnamespace.csharprect()
 dim area as double
 csharpobj.width = 10
 csharpobj.height = 20
 calarea(vbobj)
 calarea(csharpobj)
 end sub
 
 其中calarea()是一個sub過程,它接收一個imyshape類型的參數,可以傳給它任何一個實現了imyshape接口的對象,這種以接口而不是具體類來編定代碼的方法,就是典型的多態編碼方式。
 
private sub calarea(byval obj as csharpclassnamespace.imyshape)
 messagebox.show(convert.tostring(obj.area()))
end sub
 
 經過測試,跨語言、跨組件的多態的確可以正常地動作。
 
 好了,現在讓我們好好想想都實現了什么東西,可以怎樣應用到開發實踐中:
 我們可以將某個接口封裝到一個組件中,然后,具體實現這個接口的類我們可以放到不同的組件中,交給不同的程序員以他們所喜愛的語言來開發。使用這些組件的程序員只要在他的代碼中始終使用接口變量而不是具體類的變量,我們就可以動態地替換掉某個具體的實現接口的組件,而不會影響使用這些組件的程序。
 哇,這不就意味著我們可以把一個完整的軟件系統給大卸八塊,然后根據具體情況選一個組件插入系統?太棒了!下面,就讓我們來開始進行組件化編程最精彩之旅---軟件組件的動態裝配與插拔。