溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET中怎么實(shí)現(xiàn)抽象基類和派生類

發(fā)布時(shí)間:2021-07-22 15:01:17 來源:億速云 閱讀:222 作者:Leah 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)ASP.NET中怎么實(shí)現(xiàn)抽象基類和派生類,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

經(jīng)典的ASP.NET多態(tài)示例

在教授編程時(shí),有一些常用的、非常標(biāo)準(zhǔn)的示例程序。而我最初曾發(fā)誓不使用這些示例:我不會(huì)使用一個(gè)字符串類作為示例,也不會(huì)使用復(fù)雜的數(shù)字或繪圖應(yīng)用程序。畢竟,這樣做就不是原創(chuàng)了。

然而隨著事情的發(fā)展,使用這些示例顯得很有必要(不僅僅是因?yàn)閼卸瑁哼@些示例非常豐富,易于解釋和理解,并且可以非常清晰地揭示核心概念。

以下是該程序 windows 窗體版本的屏幕快照:

圖 1:經(jīng)典多態(tài)示例的 windows 窗體版本

ASP.NET中怎么實(shí)現(xiàn)抽象基類和派生類

以下是 asp.net 版本在瀏覽器中的顯示:

圖 2:經(jīng)典多態(tài)示例的 asp.net 版本:ASP.NET多態(tài)

ASP.NET中怎么實(shí)現(xiàn)抽象基類和派生類

這個(gè)程序的基本思想如下:我們有一個(gè) absspanact 基類(在 microsoft visual basic? 中是 mustinherit),其中包含公共數(shù)據(jù)(如邊框)和一套虛擬方法,虛擬方法多數(shù)是抽象的(在 visual basic 中是 mustoverride),例如 draw。請(qǐng)注意,draw 的多態(tài)性很重要,因?yàn)槊總€(gè)可繪制對(duì)象類型(如點(diǎn)、線、矩形、圓等)都是用完全不同的代碼繪制的。

雖然方法可以是多態(tài)的,但數(shù)據(jù)不能。因此,我們只將確實(shí)應(yīng)用于所有可能的可繪制對(duì)象的數(shù)據(jù)放在程序中 -- 在本例中,放置了一個(gè)邊框和顏色(在其中繪制對(duì)象的線)。

與特定類型的可繪制對(duì)象相關(guān)的數(shù)據(jù)(例如圓的中心和半徑、矩形相對(duì)點(diǎn)的坐標(biāo),或者一條線的端點(diǎn))都應(yīng)該在與該類型的可繪制對(duì)象對(duì)應(yīng)的特定類(從抽象基類中派生)中聲明。請(qǐng)注意,可以使用二次派生合并相似的對(duì)象。例如,可以從橢圓中派生出圓,因?yàn)樗械膱A都是橢圓。與此類似,也可以從矩形中派生出方形,因?yàn)樗械姆叫味际蔷匦危ㄒ捕际撬倪呅?、多邊形)。所選擇的派生樹會(huì)反映類之間的關(guān)系,以及常用的預(yù)期使用模式,這樣您經(jīng)常執(zhí)行的操作便會(huì)非??焖?、方便。

因?yàn)闃?gòu)造函數(shù)(在 visual basic 中為 new)存在的主要原因是用于初始化數(shù)據(jù),因此構(gòu)造函數(shù)不是(實(shí)際上也不能是)多態(tài)的。這意味著初始創(chuàng)建操作不能是多態(tài)的,因?yàn)閿?shù)據(jù)要求隨類型的不同而不同。但是,一個(gè)好的設(shè)計(jì)在對(duì)象創(chuàng)建后,可在之后的使用中將對(duì)象作為多態(tài)處理,這里我們就是這樣做的。

讓我們看看這個(gè)類集中包含什么,從根抽象基類開始:

抽象 (mustinherit) 基類

以下是 c# 中抽象基類的代碼。

c#

public absspanact class dshape {   public absspanact void draw(graphics g);   protected rectangle bounding;   protected color pencolor; // 還應(yīng)具有屬性   // 還應(yīng)具有移動(dòng)、調(diào)整大小等方法。   }

以下是等同的 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 ' 還應(yīng)具有屬性   ' 還應(yīng)具有移動(dòng)、調(diào)整大小等方法。   end class

語(yǔ)法雖然不同,但很明顯這是相同的類。

請(qǐng)注意,draw 方法被暗示為 virtual (overridable),因?yàn)樗宦暶鳛?absspanact (mustoverride)。還要注意在這個(gè)類中我們并沒有提供一個(gè)實(shí)現(xiàn)。因?yàn)槲覀兩胁恢涝谶@個(gè)類中執(zhí)行的對(duì)象,因此不可能寫出繪圖代碼。

包含哪些數(shù)據(jù)?

另請(qǐng)注意,這里并沒有很多數(shù)據(jù) -- 但我們已經(jīng)為這樣一個(gè)抽象類聲明了所有數(shù)據(jù)。

每一個(gè)可繪制對(duì)象(無論其形狀如何)都有一個(gè)邊框 -- 即可以完全包含該對(duì)象的最小可能矩形。邊框用于繪制點(diǎn)(作為很小的矩形)、長(zhǎng)方形和圓 -- 并且對(duì)于其他形狀,可以作為***個(gè)用于點(diǎn)擊或碰撞測(cè)試的快速估計(jì)。

適用于所有對(duì)象的其他共同點(diǎn)并沒有很多;中心對(duì)于某些對(duì)象有用,例如圓和長(zhǎng)方形,對(duì)于其他對(duì)象(如三角形)則沒有意義。并且通常都是使用角來表示矩形,而不是使用中心。但您不能使用角來指定圓,因?yàn)閳A沒有角。dr. gui 確信您已經(jīng)看到了為一個(gè)普通可繪制對(duì)象指定其他數(shù)據(jù)的困難之處。

每個(gè)可繪制對(duì)象還有一個(gè)與繪制它的線相關(guān)聯(lián)的顏色,這里我們也做了聲明。

某些派生類

如上所述,我們不能真正創(chuàng)建一個(gè)抽象基類類型的對(duì)象,雖然我們可以將從抽象基類(或任何基類)中派生的任何對(duì)象作為基類對(duì)象處理。

所以,為創(chuàng)建一個(gè)繪圖對(duì)象,我們必須從抽象基類中派生一個(gè)新類 -- 并確保覆蓋所有 absspanact/mustoverride 方法。

在本例中我們將使用 dhollowcircle 類。dhollowrectangle 類和 dpoint 類非常相似。

以下是 c# 中的 dhollowcircle。

c#

public class dhollowcircle : dshape   {   public dhollowcircle(point p, int radius, color pencolor) {   p.offset(-radius, -radius); // 需要轉(zhuǎn)換到左上角   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) ' 需要轉(zhuǎn)換到左上角   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

請(qǐng)注意,我們沒有為這個(gè)類聲明其他數(shù)據(jù) -- 它給出的邊框和筆已經(jīng)足夠了。(對(duì)于點(diǎn)和矩形是這樣,但對(duì)于三角形和其他多邊形就不夠了。)我們的應(yīng)用程序不需要在設(shè)置圓后知道圓的中心或半徑,因此將它們忽略掉。(如果需要中心和半徑,我們可以存儲(chǔ)這些數(shù)據(jù),或者根據(jù)邊框計(jì)算得出。)

但我們確實(shí)需要邊框,因?yàn)樗怯糜诶L制圓的 graphics.drawellipse 方法的一個(gè)參數(shù)。因此我們根據(jù)在構(gòu)造函數(shù)中傳遞的中心點(diǎn)和半徑計(jì)算邊框。

上述就是小編為大家分享的ASP.NET中怎么實(shí)現(xiàn)抽象基類和派生類了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI