版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、抽象類和接口的區(qū)別 區(qū)分抽象類與接口 舉例詳說c#抽象類和接口的區(qū)分一、抽象類 (1) 抽象方法只作聲明,而不包含實(shí)現(xiàn),可以看成是沒有實(shí)現(xiàn)體的虛方法 (2) 抽象類不能被實(shí)例化 (3) 抽象類可以但不是必需有抽象屬性和抽象方法,但是一旦有了抽象方法,就肯定要把這個(gè)類聲明為抽象類 (4) 詳細(xì)派生類必需掩蓋基類的抽象方法 (5) 抽象派生類可以掩蓋基類的抽象方法,也可以不掩蓋。假如不掩蓋,則其詳細(xì)派生類必需掩蓋它們。如: using system; public abstract class a /抽象類a private int num=0; public int num /抽象類包含屬性 g
2、et return num; set num = value; public virtual int getnum() /抽象類包含虛方法 return num; public void setnum(int n) / /抽象類包含一般方法 this.num = n; public abstract void e(); /類a中的抽象方法e public abstract class b : a /由于類b繼承了類a中的抽象方法e,所以類b也變成了抽象類 public class c : b public override void e() /重寫從類a繼承的抽象方法。假如類b自己還定義了抽象
3、方法,也必需重寫 /throw new exception(the method or operation is not implemented.); public class test 區(qū)分抽象類與接口 static void main() c c = new c(); c.e(); 二、接 口 (1) 接口不能被實(shí)例化 (2) 接口只能包含方法聲明 (3) 接口的成員包括方法、屬性、索引器、大事 (4) 接口中不能包含常量、字段(域)、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員。如: public delegate void eventhandler(object sender, event e); p
4、ublic interface itest /int x = 0; int a get; set; void test(); event eventhandler event; int thisint index get; set; (5) 接口中的全部成員默認(rèn)為public,因此接口中不能有private修飾符 (6) 派生類必需實(shí)現(xiàn)接口的全部成員 (7) 一個(gè)類可以直接實(shí)現(xiàn)多個(gè)接口,接口之間用逗號(hào)隔開 (8) 一個(gè)接口可以有多個(gè)父接口,實(shí)現(xiàn)該接口的類必需實(shí)現(xiàn)全部父接口中的全部成員 三、抽象類和接口 相同點(diǎn): (1) 都可以被繼承 (2) 都不能被實(shí)例化 (3) 都可以包含方法聲明 (4)
5、派生類必需實(shí)現(xiàn)未實(shí)現(xiàn)的方法 區(qū) 別: (1) 抽象基類可以定義字段、屬性、方法實(shí)現(xiàn)。接口只能定義屬性、索引器、大事、和方法聲明,不能包含字段。 (2) 抽象類是一個(gè)不完整的類,需要進(jìn)一步細(xì)化,而接口是一個(gè)行為規(guī)范。微軟的自定義接口總是后帶able字段,證明其是表述一類“我能做?!?(3) 接口可以被多重實(shí)現(xiàn),抽象類只能被單一繼承 (4) 抽象類更多的是定義在一系列緊密相關(guān)的類間,而接口大多數(shù)是關(guān)系疏松但都實(shí)現(xiàn)某一功能的類中 區(qū)分抽象類與接口 (5) 抽象類是從一系列相關(guān)對(duì)象中抽象出來的概念, 因此反映的是事物的內(nèi)部共性;接口是為了滿意外部調(diào)用而定義的一個(gè)功能商定, 因此反映的是事物的外部特性
6、(6) 接口基本上不具備繼承的任何詳細(xì)特點(diǎn),它僅僅承諾了能夠調(diào)用的方法 (7) 接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn) (8) 抽象類實(shí)現(xiàn)的詳細(xì)方法默認(rèn)為虛的,但實(shí)現(xiàn)接口的類中的接口方法卻默認(rèn)為非虛的,當(dāng)然您也可以聲明為虛的 (9) 假如抽象類實(shí)現(xiàn)接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實(shí)現(xiàn),而在抽象類的子類中實(shí)現(xiàn)接口中方法 使用規(guī)章: 1、抽象類主要用于關(guān)系親密的對(duì)象,而接口最適合為不相關(guān)的類供應(yīng)通用功能 2、假如要設(shè)計(jì)大的功能單元,則使用抽象類;假如要設(shè)計(jì)小而簡(jiǎn)練的功能塊,則使用接口。 3、假如估計(jì)要?jiǎng)?chuàng)建組件的多個(gè)版本,則創(chuàng)建抽象類。接口一旦創(chuàng)建就不能更改。假如需要接
7、口的新版本,必需創(chuàng)建一個(gè)全新的接口。 4、假如創(chuàng)建的功能將在大范圍的全異對(duì)象間使用,則使用接口;假如要在組件的全部實(shí)現(xiàn)間供應(yīng)通用的已實(shí)現(xiàn)功能,則使用抽象類。 5、分析對(duì)象,提煉內(nèi)部共性形成抽象類,用以表示對(duì)象本質(zhì),即“是什么”。為外部供應(yīng)調(diào)用或功能需要擴(kuò)充時(shí)優(yōu)先使用接口 6、好的接口定義應(yīng)當(dāng)是具有專一功能性的,而不是多功能的,否則造成接口污染。假如一個(gè)類只是實(shí)現(xiàn)了這個(gè)接口的中一個(gè)功能,而不得不去實(shí)現(xiàn)接口中的其他方法,就叫接口污染 7、盡量避開使用繼承來實(shí)現(xiàn)組建功能,而是使用黑箱復(fù)用,即對(duì)象組合。由于繼承的層次增多,造成最直接的后果就是當(dāng)你調(diào)用這個(gè)類群中某一類,就必需把他們?nèi)考虞d到棧中!后果可
8、想而知。(結(jié)合堆棧原理理解)。同時(shí),有心的伴侶可以留意到微軟在構(gòu)建一個(gè)類時(shí),許多時(shí)候用到了對(duì)象組合的方法。比如 中,page類,有server request等屬性,但其實(shí)他們都是某個(gè)類的對(duì)象。使用page類的這個(gè)對(duì)象來調(diào)用另外的類的方法和屬性,這個(gè)是特別基本的一個(gè)設(shè)計(jì)原則 例 如: window窗體可以用抽象類來設(shè)計(jì),可以把公有操作和屬性放到一個(gè)抽象類里,讓窗體和對(duì)話框繼承自這個(gè)抽象類,再依據(jù)自己的需求進(jìn)行擴(kuò)展和完善。 打印操作可以作為一個(gè)接口供應(yīng)給每個(gè)需要此功能的窗體,由于窗體的內(nèi)容不同,就要依據(jù)他們自己的要求去實(shí)現(xiàn)自己的打印功能。打印時(shí)只通過接口來調(diào)用,而不用在乎是那個(gè)窗體要打印。 四、
9、其它文章 共性、共性與選擇 有的書上寫到c#推舉使用接口(interface)來替代抽象基類(abstract class),并強(qiáng)調(diào)使用接口的諸多好處,這點(diǎn)我不敢茍同,從上面列表中看來,兩者之間還是存在不少差異的,而這種差異的存在性必定打算了適用場(chǎng)景的不同,例如在抽象基類中可以為部分方法供應(yīng)默認(rèn)的實(shí)現(xiàn),從而避開在子類中重復(fù)實(shí)現(xiàn)它們,提高代碼的可重用性,這是抽象類的優(yōu)勢(shì)所在;而接口中只能包含抽象方法。至于何時(shí)使用抽象基類何時(shí)使用接口關(guān)鍵還是取決于用戶是如何看待繼承類之間的聯(lián)系的,用戶更加關(guān)懷的是它們之間的共性差異還是它們之間的共性聯(lián)系。舉個(gè)生活中的例子加以說明。 假如給你三個(gè)對(duì)象分別是人、魚、青
10、蛙,讓你為他們?cè)O(shè)計(jì)個(gè)基類來概括它們之間的聯(lián)系,那么首先給你的感覺確定是它們個(gè)體間的差異性較大,很難抽象出共性,然而若讓你概括他們行為之間的共性,你可能想了想會(huì)意識(shí)到他們都會(huì)游泳,只不過是游泳方式迥異。那么這時(shí)你就應(yīng)當(dāng)考慮使用接口而不是抽象基類,緣由有三條: 1. 共性大于共性。 2. 差異較大的共性間具有某些相同的行為。 3. 相同行為的實(shí)現(xiàn)方式有較大區(qū)分。 這時(shí)再給你三個(gè)對(duì)象,分別是鯽魚、鯉魚、金魚,仍舊讓你設(shè)計(jì)基類來概括它們之間的聯(lián)系,那么你第一個(gè)意識(shí)到的確定是它們都屬于魚類,其次是他們游泳的方式可能稍有差異,這時(shí)就應(yīng)當(dāng)使用抽象基類而不是接口,對(duì)比著上面的例子,緣由也有三條: interf
11、ace iswim void swim(); 區(qū)分抽象類與接口 public class person : iswim public void swim() /swimming in person's style. public class frog : iswim public void swim() /swimming in frog's style. public class fish : iswim public void swim() /swimming in fish's style. 1. 共性大于共性 2. 共性相同的個(gè)體間必定具有相同的屬性與行為 3.
12、 相同行為的實(shí)現(xiàn)方式具有肯定區(qū)分 abstract public class fish abstract public void swim(); public class 鯽魚 : fish public override void swim() /swim like a 鯽魚 public class 鯉魚 : fish public override void swim() /swim like a 鯉魚 public class 金魚 : fish public override void swim() /swim like a 金魚 觀看在使用接口或是使用抽象基類的幾條理由中,第三條理
13、由其實(shí)是一樣的,它所描述的是 區(qū)分抽象類與接口 面對(duì)對(duì)象中多態(tài)的概念,即通過掩蓋父類的方法來實(shí)現(xiàn),在運(yùn)行時(shí)依據(jù)傳遞的對(duì)象引用,來調(diào)用相應(yīng)的方法。其次條理由開頭產(chǎn)生分歧,接口更加強(qiáng)調(diào)了繼承對(duì)象間具有相同的行為,而抽象類同時(shí)還強(qiáng)調(diào)了繼承對(duì)象間具有相同的屬性。而真正將接口與抽象基類區(qū)分開的則是理由 一,歸納如下: 當(dāng)在差異較大的對(duì)象間尋求功能上的共性時(shí),使用接口。 當(dāng)在共性較多的對(duì)象間尋求功能上的差異時(shí),使用抽象基類。 通過相同與不同的比較,我們只能說接口和抽象類,各有所長,但無優(yōu)略。在實(shí)際的編程實(shí)踐中,我們要視詳細(xì)狀況來酌情量才,但是以下的閱歷和積累,或許能給大家一些啟示,除了我的一些積累之外,許
14、多都來源于經(jīng)典,我信任經(jīng)得起考驗(yàn)。所以在規(guī)章與場(chǎng)合中,我們學(xué)習(xí)這些經(jīng)典,最重要的是學(xué)以致用,當(dāng)然我將以一家之言博大家之笑,看官請(qǐng)連續(xù)。 規(guī)章與場(chǎng)合 1.請(qǐng)記住,面對(duì)對(duì)象思想的一個(gè)最重要的原則就是:面對(duì)接口編程。 2.借助接口和抽象類,23個(gè)設(shè)計(jì)模式中的許多思想被奇妙的實(shí)現(xiàn)了,我認(rèn)為其精髓簡(jiǎn)潔說來就是:面對(duì)抽象編程。 3.抽象類應(yīng)主要用于關(guān)系親密的對(duì)象,而接口最適合為不相關(guān)的類供應(yīng)通用功能。 4.接口著重于can-do關(guān)系類型,而抽象類則偏重于is-a式的關(guān)系; 5.接口多定義對(duì)象的行為;抽象類多定義對(duì)象的屬性; 6.接口定義可以使用public、protected、internal 和private修飾符,但是幾乎全部的接口都定義為public,緣由就不必多說了。 7.“接口不變”,是應(yīng)當(dāng)考慮的重要因素。所以,在由接口增加擴(kuò)展時(shí),應(yīng)當(dāng)增加新的接口,而不能更改現(xiàn)有接口。 8.盡量將接口設(shè)計(jì)勝利能單一的功能塊,以.net framework為例,idisposable、idisposable、icomparable、iequatable、ienumerable等都只包含一個(gè)公共方法。 9.接口名稱前面的大寫字母“i”是一個(gè)商定,正如字段名以下劃線開頭一樣,請(qǐng)堅(jiān)持這些原則。 10.在接口中,全部的方法都默認(rèn)為public。 11.假如估計(jì)會(huì)消失版本問題,可以創(chuàng)建“抽象類”。例如,創(chuàng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版農(nóng)業(yè)機(jī)械租賃與農(nóng)業(yè)大數(shù)據(jù)應(yīng)用合同3篇
- 2024 湖南省公務(wù)員考試真題及答案(A類、B類、行政執(zhí)法、綜合管理崗、省考)5套
- 建立餐飲行業(yè)的可持續(xù)發(fā)展模式
- 2025年廣西韻陽文化藝術(shù)有限公司招聘筆試參考題庫含答案解析
- 2025年貴州云華祥昇實(shí)業(yè)有限公司招聘筆試參考題庫含答案解析
- 二零二五年度鎳礦石開采環(huán)境保護(hù)與生態(tài)修復(fù)合同4篇
- 二零二五年度畜牧產(chǎn)業(yè)園區(qū)入駐項(xiàng)目買賣合同范本4篇
- 二零二五年度智慧社區(qū)農(nóng)民工就業(yè)管理合同3篇
- 2025年牛津譯林版七年級(jí)歷史上冊(cè)階段測(cè)試試卷含答案
- 2025年華東師大版九年級(jí)地理下冊(cè)月考試卷含答案
- 醫(yī)院運(yùn)送工作介紹
- 小學(xué)四年級(jí)上冊(cè)遞等式計(jì)算100題及答案
- 設(shè)計(jì)師績(jī)效考核
- 高考日語基礎(chǔ)歸納總結(jié)與練習(xí)(一輪復(fù)習(xí))
- 《預(yù)防犯罪》課件
- 【企業(yè)作業(yè)成本在上海汽車集團(tuán)中的應(yīng)用研究案例7300字(論文)】
- 高中物理答題卡模板
- 化學(xué)用語專項(xiàng)訓(xùn)練
- 芳香植物與芳香療法講解課件
- 不孕癥診斷、治療新進(jìn)展課件
- 學(xué)校食堂食品質(zhì)量控制方案
評(píng)論
0/150
提交評(píng)論