ASP.NET多態示例 抽象基類及派生類
在本文,我們將通過一個靈活的繪圖應用程序提供一個有關繼承、absspanact (mustinherit) 基類和接口的更為完整的示例。這不是一個控制臺應用程序;由于其圖形化的特征,更適合作為一個 microsoft windows 窗體應用程序。(這就給了我們一個了解 windows 窗體的機會。)
該 asp.net 版本將演示如何在 web 頁上使用自定義繪制的位圖 -- 這在大多數 web 編程系統中是非常難以實現的,但使用 asp.net 則很簡單。dr. gui 相信您會喜歡這一點。而且您還可以運行該應用程序。
經典的ASP.NET多態示例
在教授編程時,有一些常用的、非常標準的示例程序。而我最初曾發誓不使用這些示例:我不會使用一個字符串類作為示例,也不會使用復雜的數字或繪圖應用程序。畢竟,這樣做就不是原創了。
然而隨著事情的發展,使用這些示例顯得很有必要(不僅僅是因為懶惰):這些示例非常豐富,易于解釋和理解,并且可以非常清晰地揭示核心概念。
以下是該程序 windows 窗體版本的屏幕快照:
圖 1:經典多態示例的 windows 窗體版本
以下是 asp.net 版本在瀏覽器中的顯示:
圖 2:經典多態示例的 asp.net 版本:ASP.NET多態
這個程序的基本思想如下:我們有一個 absspanact 基類(在 microsoft visual basic? 中是 mustinherit),其中包含公共數據(如邊框)和一套虛擬方法,虛擬方法多數是抽象的(在 visual basic 中是 mustoverride),例如 draw。請注意,draw 的多態性很重要,因為每個可繪制對象類型(如點、線、矩形、圓等)都是用完全不同的代碼繪制的。
雖然方法可以是多態的,但數據不能。因此,我們只將確實應用于所有可能的可繪制對象的數據放在程序中 -- 在本例中,放置了一個邊框和顏色(在其中繪制對象的線)。
與特定類型的可繪制對象相關的數據(例如圓的中心和半徑、矩形相對點的坐標,或者一條線的端點)都應該在與該類型的可繪制對象對應的特定類(從抽象基類中派生)中聲明。請注意,可以使用二次派生合并相似的對象。例如,可以從橢圓中派生出圓,因為所有的圓都是橢圓。與此類似,也可以從矩形中派生出方形,因為所有的方形都是矩形(也都是四邊形、多邊形)。所選擇的派生樹會反映類之間的關系,以及常用的預期使用模式,這樣您經常執行的操作便會非常快速、方便。
因為構造函數(在 visual basic 中為 new)存在的主要原因是用于初始化數據,因此構造函數不是(實際上也不能是)多態的。這意味著初始創建操作不能是多態的,因為數據要求隨類型的不同而不同。但是,一個好的設計在對象創建后,可在之后的使用中將對象作為多態處理,這里我們就是這樣做的。
讓我們看看這個類集中包含什么,從根抽象基類開始:
抽象 (mustinherit) 基類
以下是 c# 中抽象基類的代碼。
c#
- public absspanact class dshape {
- public absspanact void draw(graphics g);
- protected rectangle bounding;
- protected color pencolor; // 還應具有屬性
- // 還應具有移動、調整大小等方法。
- }
以下是等同的 visual basic .net 代碼。
visual basic .net
- public mustinherit class dshape
- public mustoverride sub draw(byval g as graphics)
- protected bounding as rectangle
- protected pencolor as color ' 還應具有屬性
- ' 還應具有移動、調整大小等方法。
- end class
語法雖然不同,但很明顯這是相同的類。
請注意,draw 方法被暗示為 virtual (overridable),因為它被聲明為 absspanact (mustoverride)。還要注意在這個類中我們并沒有提供一個實現。因為我們尚不知道在這個類中執行的對象,因此不可能寫出繪圖代碼。
包含哪些數據?
另請注意,這里并沒有很多數據 -- 但我們已經為這樣一個抽象類聲明了所有數據。
每一個可繪制對象(無論其形狀如何)都有一個邊框 -- 即可以完全包含該對象的最小可能矩形。邊框用于繪制點(作為很小的矩形)、長方形和圓 -- 并且對于其他形狀,可以作為***個用于點擊或碰撞測試的快速估計。
適用于所有對象的其他共同點并沒有很多;中心對于某些對象有用,例如圓和長方形,對于其他對象(如三角形)則沒有意義。并且通常都是使用角來表示矩形,而不是使用中心。但您不能使用角來指定圓,因為圓沒有角。dr. gui 確信您已經看到了為一個普通可繪制對象指定其他數據的困難之處。
每個可繪制對象還有一個與繪制它的線相關聯的顏色,這里我們也做了聲明。
某些派生類
如上所述,我們不能真正創建一個抽象基類類型的對象,雖然我們可以將從抽象基類(或任何基類)中派生的任何對象作為基類對象處理。
所以,為創建一個繪圖對象,我們必須從抽象基類中派生一個新類 -- 并確保覆蓋所有 absspanact/mustoverride 方法。
在本例中我們將使用 dhollowcircle 類。dhollowrectangle 類和 dpoint 類非常相似。
以下是 c# 中的 dhollowcircle。
c#
- public class dhollowcircle : dshape
- {
- public dhollowcircle(point p, int radius, color pencolor) {
- p.offset(-radius, -radius); // 需要轉換到左上角
- int diameter = radius * 2;
- bounding = new rectangle(p, new size(diameter, diameter));
- this.pencolor = pencolor;
- }
- public override void draw(graphics g) {
- using (pen p = new pen(pencolor)) {
- g.drawellipse(p, bounding);
- }
- }
- }
以下是等同的 visual basic .net 類。
visual basic .net
- public class dhollowcircle
- inherits dshape
- public sub new(byval p as point, byval radius as integer, _
- byval pencolor as color)
- p.offset(-radius, -radius) ' 需要轉換到左上角
- dim diameter as integer = radius * 2
- bounding = new rectangle(p, new size(diameter, diameter))
- me.pencolor = pencolor
- end sub
- public overrides sub draw(byval g as graphics)
- dim p = new pen(pencolor)
- try
- g.drawellipse(p, bounding)
- finally
- p.dispose()
- end try
- end sub
- end class
請注意,我們沒有為這個類聲明其他數據 -- 它給出的邊框和筆已經足夠了。(對于點和矩形是這樣,但對于三角形和其他多邊形就不夠了。)我們的應用程序不需要在設置圓后知道圓的中心或半徑,因此將它們忽略掉。(如果需要中心和半徑,我們可以存儲這些數據,或者根據邊框計算得出。)
但我們確實需要邊框,因為它是用于繪制圓的 graphics.drawellipse 方法的一個參數。因此我們根據在構造函數中傳遞的中心點和半徑計算邊框。
ASP.NET多態、抽象基類以及派生類就介紹到這里。
【編輯推薦】