抽象類和接口的區(qū)別_第1頁
抽象類和接口的區(qū)別_第2頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、抽象類和接口的區(qū)別 區(qū)分抽象類與接口 舉例詳說c#抽象類和接口的區(qū)分一、抽象類 (1) 抽象方法只作聲明,而不包含實現(xiàn),可以看成是沒有實現(xiàn)體的虛方法 (2) 抽象類不能被實例化 (3) 抽象類可以但不是必需有抽象屬性和抽象方法,但是一旦有了抽象方法,就肯定要把這個類聲明為抽象類 (4) 詳細派生類必需掩蓋基類的抽象方法 (5) 抽象派生類可以掩蓋基類的抽象方法,也可以不掩蓋。假如不掩蓋,則其詳細派生類必需掩蓋它們。如: 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) 接口不能被實例化 (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) 接口中的全部成員默認為public,因此接口中不能有private修飾符 (6) 派生類必需實現(xiàn)接口的全部成員 (7) 一個類可以直接實現(xiàn)多個接口,接口之間用逗號隔開 (8) 一個接口可以有多個父接口,實現(xiàn)該接口的類必需實現(xiàn)全部父接口中的全部成員 三、抽象類和接口 相同點: (1) 都可以被繼承 (2) 都不能被實例化 (3) 都可以包含方法聲明 (4)

5、派生類必需實現(xiàn)未實現(xiàn)的方法 區(qū) 別: (1) 抽象基類可以定義字段、屬性、方法實現(xiàn)。接口只能定義屬性、索引器、大事、和方法聲明,不能包含字段。 (2) 抽象類是一個不完整的類,需要進一步細化,而接口是一個行為規(guī)范。微軟的自定義接口總是后帶able字段,證明其是表述一類“我能做?!?(3) 接口可以被多重實現(xiàn),抽象類只能被單一繼承 (4) 抽象類更多的是定義在一系列緊密相關(guān)的類間,而接口大多數(shù)是關(guān)系疏松但都實現(xiàn)某一功能的類中 區(qū)分抽象類與接口 (5) 抽象類是從一系列相關(guān)對象中抽象出來的概念, 因此反映的是事物的內(nèi)部共性;接口是為了滿意外部調(diào)用而定義的一個功能商定, 因此反映的是事物的外部特性

6、(6) 接口基本上不具備繼承的任何詳細特點,它僅僅承諾了能夠調(diào)用的方法 (7) 接口可以用于支持回調(diào),而繼承并不具備這個特點 (8) 抽象類實現(xiàn)的詳細方法默認為虛的,但實現(xiàn)接口的類中的接口方法卻默認為非虛的,當然您也可以聲明為虛的 (9) 假如抽象類實現(xiàn)接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實現(xiàn),而在抽象類的子類中實現(xiàn)接口中方法 使用規(guī)章: 1、抽象類主要用于關(guān)系親密的對象,而接口最適合為不相關(guān)的類供應通用功能 2、假如要設(shè)計大的功能單元,則使用抽象類;假如要設(shè)計小而簡練的功能塊,則使用接口。 3、假如估計要創(chuàng)建組件的多個版本,則創(chuàng)建抽象類。接口一旦創(chuàng)建就不能更改。假如需要接

7、口的新版本,必需創(chuàng)建一個全新的接口。 4、假如創(chuàng)建的功能將在大范圍的全異對象間使用,則使用接口;假如要在組件的全部實現(xiàn)間供應通用的已實現(xiàn)功能,則使用抽象類。 5、分析對象,提煉內(nèi)部共性形成抽象類,用以表示對象本質(zhì),即“是什么”。為外部供應調(diào)用或功能需要擴充時優(yōu)先使用接口 6、好的接口定義應當是具有專一功能性的,而不是多功能的,否則造成接口污染。假如一個類只是實現(xiàn)了這個接口的中一個功能,而不得不去實現(xiàn)接口中的其他方法,就叫接口污染 7、盡量避開使用繼承來實現(xiàn)組建功能,而是使用黑箱復用,即對象組合。由于繼承的層次增多,造成最直接的后果就是當你調(diào)用這個類群中某一類,就必需把他們?nèi)考虞d到棧中!后果可

8、想而知。(結(jié)合堆棧原理理解)。同時,有心的伴侶可以留意到微軟在構(gòu)建一個類時,許多時候用到了對象組合的方法。比如 中,page類,有server request等屬性,但其實他們都是某個類的對象。使用page類的這個對象來調(diào)用另外的類的方法和屬性,這個是特別基本的一個設(shè)計原則 例 如: window窗體可以用抽象類來設(shè)計,可以把公有操作和屬性放到一個抽象類里,讓窗體和對話框繼承自這個抽象類,再依據(jù)自己的需求進行擴展和完善。 打印操作可以作為一個接口供應給每個需要此功能的窗體,由于窗體的內(nèi)容不同,就要依據(jù)他們自己的要求去實現(xiàn)自己的打印功能。打印時只通過接口來調(diào)用,而不用在乎是那個窗體要打印。 四、

9、其它文章 共性、共性與選擇 有的書上寫到c#推舉使用接口(interface)來替代抽象基類(abstract class),并強調(diào)使用接口的諸多好處,這點我不敢茍同,從上面列表中看來,兩者之間還是存在不少差異的,而這種差異的存在性必定打算了適用場景的不同,例如在抽象基類中可以為部分方法供應默認的實現(xiàn),從而避開在子類中重復實現(xiàn)它們,提高代碼的可重用性,這是抽象類的優(yōu)勢所在;而接口中只能包含抽象方法。至于何時使用抽象基類何時使用接口關(guān)鍵還是取決于用戶是如何看待繼承類之間的聯(lián)系的,用戶更加關(guān)懷的是它們之間的共性差異還是它們之間的共性聯(lián)系。舉個生活中的例子加以說明。 假如給你三個對象分別是人、魚、青

10、蛙,讓你為他們設(shè)計個基類來概括它們之間的聯(lián)系,那么首先給你的感覺確定是它們個體間的差異性較大,很難抽象出共性,然而若讓你概括他們行為之間的共性,你可能想了想會意識到他們都會游泳,只不過是游泳方式迥異。那么這時你就應當考慮使用接口而不是抽象基類,緣由有三條: 1. 共性大于共性。 2. 差異較大的共性間具有某些相同的行為。 3. 相同行為的實現(xiàn)方式有較大區(qū)分。 這時再給你三個對象,分別是鯽魚、鯉魚、金魚,仍舊讓你設(shè)計基類來概括它們之間的聯(lián)系,那么你第一個意識到的確定是它們都屬于魚類,其次是他們游泳的方式可能稍有差異,這時就應當使用抽象基類而不是接口,對比著上面的例子,緣由也有三條: 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. 共性相同的個體間必定具有相同的屬性與行為 3.

12、 相同行為的實現(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、由其實是一樣的,它所描述的是 區(qū)分抽象類與接口 面對對象中多態(tài)的概念,即通過掩蓋父類的方法來實現(xiàn),在運行時依據(jù)傳遞的對象引用,來調(diào)用相應的方法。其次條理由開頭產(chǎn)生分歧,接口更加強調(diào)了繼承對象間具有相同的行為,而抽象類同時還強調(diào)了繼承對象間具有相同的屬性。而真正將接口與抽象基類區(qū)分開的則是理由 一,歸納如下: 當在差異較大的對象間尋求功能上的共性時,使用接口。 當在共性較多的對象間尋求功能上的差異時,使用抽象基類。 通過相同與不同的比較,我們只能說接口和抽象類,各有所長,但無優(yōu)略。在實際的編程實踐中,我們要視詳細狀況來酌情量才,但是以下的閱歷和積累,或許能給大家一些啟示,除了我的一些積累之外,許

14、多都來源于經(jīng)典,我信任經(jīng)得起考驗。所以在規(guī)章與場合中,我們學習這些經(jīng)典,最重要的是學以致用,當然我將以一家之言博大家之笑,看官請連續(xù)。 規(guī)章與場合 1.請記住,面對對象思想的一個最重要的原則就是:面對接口編程。 2.借助接口和抽象類,23個設(shè)計模式中的許多思想被奇妙的實現(xiàn)了,我認為其精髓簡潔說來就是:面對抽象編程。 3.抽象類應主要用于關(guān)系親密的對象,而接口最適合為不相關(guān)的類供應通用功能。 4.接口著重于can-do關(guān)系類型,而抽象類則偏重于is-a式的關(guān)系; 5.接口多定義對象的行為;抽象類多定義對象的屬性; 6.接口定義可以使用public、protected、internal 和private修飾符,但是幾乎全部的接口都定義為public,緣由就不必多說了。 7.“接口不變”,是應當考慮的重要因素。所以,在由接口增加擴展時,應當增加新的接口,而不能更改現(xiàn)有接口。 8.盡量將接口設(shè)計勝利能單一的功能塊,以.net framework為例,idisposable、idisposable、icomparable、iequatable、ienumerable等都只包含一個公共方法。 9.接口名稱前面的大寫字母“i”是一個商定,正如字段名以下劃線開頭一樣,請堅持這些原則。 10.在接口中,全部的方法都默認為public。 11.假如估計會消失版本問題,可以創(chuàng)建“抽象類”。例如,創(chuàng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論