国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

基于組件的.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



經過測試,跨語言、跨組件的多態的確可以正常地動作。



好了,現在讓我們好好想想都實現了什么東西,可以怎樣應用到開發實踐中:

我們可以將某個接口封裝到一個組件中,然后,具體實現這個接口的類我們可以放到不同的組件中,交給不同的程序員以他們所喜愛的語言來開發。使用這些組件的程序員只要在他的代碼中始終使用接口變量而不是具體類的變量,我們就可以動態地替換掉某個具體的實現接口的組件,而不會影響使用這些組件的程序。

哇,這不就意味著我們可以把一個完整的軟件系統給大卸八塊,然后根據具體情況選一個組件插入系統?太棒了!下面,就讓我們來開始進行組件化編程最精彩之旅---軟件組件的動態裝配與插拔。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平凉市| 庆元县| 丽水市| 新化县| 阿鲁科尔沁旗| 沁水县| 顺平县| 灵武市| 铜陵市| 永州市| 米林县| 栖霞市| 鄱阳县| 内乡县| 宁国市| 宜良县| 衡山县| 文水县| 礼泉县| 上饶市| 襄樊市| 宁安市| 柳江县| 武山县| 西林县| 威信县| 搜索| 临西县| 石家庄市| 漳平市| 丹江口市| 独山县| 开鲁县| 府谷县| 临海市| 正定县| 内黄县| 普定县| 门头沟区| 三都| 兖州市|