基於組件的.NET軟體開發(2)
來源:互聯網
上載者:User
組件的繼承
前面實現的將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
經過測試,跨語言、跨組件的多態的確可以正常地動作。
好了,現在讓我們好好想想都實現了什麼東西,可以怎樣應用到開發實踐中:
我們可以將某個介面封裝到一個組件中,然後,具體實現這個介面的類我們可以放到不同的組件中,交給不同的程式員以他們所喜愛的語言來開發。使用這些組件的程式員只要在他的代碼中始終使用介面變數而不是具體類的變數,我們就可以動態地替換掉某個具體的實現介面的組件,而不會影響使用這些組件的程式。
哇,這不就意味著我們可以把一個完整的軟體系統給大卸八塊,然後根據具體情況選一個組件插入系統?太棒了!下面,就讓我們來開始進行組件化編程最精彩之旅---軟體組件的動態裝配與插拔。