首先感謝園裡的一位前輩anytao.cnblogs.com ,他對面向抽象類和接口編程作出比較完善的總結.下面的總結是直接Copy他的原話.
一.相同點 ● 都不能被直接實例化,都可以通過繼承實現其抽象方法。
● 都是面向抽象編程的技術基礎,實現了諸多的設計模式。
二.不同點
● 接口支持多繼承;抽象類不能實現多繼承。
● 接口只能定義抽象規則;抽象類既可以定義規則,還可能 提供已實現的成員。
● 接口是一組行為規范;抽象類是一個不完全的類,著重族的概念。
● 接口可以用於支持回調;抽象類 不能實現回調,因為繼承不支持。
● 接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類可以 定義字段、屬性、包含有
實現的方法。
● 接口可以作用於值類型和引用類型;抽象類只能作用於引用類型。例如,Struct就可 以繼承接口,而不能繼承類。
通過相同與不同的比較,我們只能說接口和抽象類,各有所長,但無優略。在實際的編程實踐中,我們要 視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,很多都來源於經典,我相信經得起考驗。 所以在規則與場合中,我們學習這些經典,最重要的是學以致用,當然我將以一家之言博大家之笑,看官請繼續。
三.規則與場合
● 請記住,面向對象思想的一個最重要的原則就是:面向接口編程。
● 借助接口和抽象類,23個設計模式中的很多思想被巧 妙的實現了,我認為其精髓簡單說來就是:面向抽象編程。
● 抽象類應主要用於關系密切的對象,而接口最適合為不相關的類提供通 用功能。
● 接口著重於CAN-DO關系類型,而抽象類則偏重於IS-A式的關系;
● 接口多定義對象的行為;抽象類多定義對象的 屬性;
● 接口定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的接口都定義為public,原因就不必
多說了。
● “接口不變”,是應該考慮的重要因素。所以,在由接口增加擴展時,應該增加新的接口,而不能更改 現有接口。
● 盡量將接口設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IDisposable、IComparable、
IEquatable、IEnumerable等都只包含一個公共方法。
● 接口名稱前面的大寫字母“I”是一個約定,正如字段名以 下劃線開頭一樣,請堅持這些原則。
● 在接口中,所有的方法都默認為public。
● 如果預計會出現版本問題,可以創建 “抽象類”。例如,創建了狗(Dog)、雞(Chicken)和鴨(Duck),那麼應該
考慮抽象出動物(Animal)來應對以後可能 出現風馬牛的事情。而向接口中添加新成員則會強制要求修改所有派生類,並
重新編譯,所以版本式的問題最好以抽象類來實現。
● 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
● 對抽象類不能使用new關鍵字,也不能被 密封,原因是抽象類不能被實例化。
● 在抽象方法聲明中不能使用 static 或 virtual 修飾符。
正所謂真理是大家看出來的, 所以將原子裡有創新性的觀點潛列於此,一是感謝大家的共享,二是完善一家之言的不足,希望能夠將領域域形成知識,受用於我,受用於眾。
以前在園字裡看過很多前輩對抽象類和接口的探討,結論是各有千秋,言之不盡。其中我最有印象的是dunai和shenfx的總結:
● dunai:抽象類是提取具體類的公因式,而接口是為了將一些不相關的類“雜湊”成一個共同的群體。至於他們在各個語言中的 句法,語言細節並不是我關心的重點。
● shenfx:當在差異較大的對象間尋求功能上的共性時,使用接口;當在共性較多的對象間尋求 功能上的差異時,使用抽象類。
MSDN對抽象類和接口又是怎麼解說的呢?下面是我在MSDN上Copy的建議:
● 如果預計要創建組 件的多個版本,則創建抽象類。抽象類提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都
隨更改自動更新。另一方面 ,接口一旦創建就不能更改。如果需要接口的新版本,必須創建一個全新的接口。
● 如果創建的功能將在大范圍的全異對象間使用, 則使用接口。抽象類應主要用於關系密切的對象,而接口最適合為不相關的類提供通用功能。
● 如果要設計小而簡練的功能塊,則使 用接口。如果要設計大的功能單元,則使用抽象類。
● 如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。抽象類允 許部分實現類,而接口不包含任何成員的實現。
另外我們在看看Dflying Chen和一醉解千愁 他門倆的見解:
Dflying Chen: 接口用來定義兩個對象通信的契約;抽象類用來封裝對象間公用的行為。二者在設計起初的目標完全不同,
可惜在實際應用中被太多的 人誤解。
一醉解千愁:接口 -- 粗略的技術規范, 抽象類 -- 對粗略的技術規范作了一些簡單的說明 ,類 -- 技術規范的具體實 現.
在我們大型的項目中,一般項目經理會按照功能分塊,那麼每個塊最終必然是有聯系的,他們靠什麼聯系呢?當然就是公開的接口 了.至於接口下面是怎麼實現的,大家沒有必要知道太多,只要知道他們組這個接口實現了什麼功能既可.這個時候,各版塊之間的升級也就 顯得簡單了,只要接口不動,內部的代碼隨便怎麼修改都顯得不那麼重要了. 另外就是代碼的復用程度更加高和更簡單了.
這也同時 說明了接口的設計相對來說是很重要的了,現在您也明白了我為什麼花上這麼長的時間和這麼長的篇幅借用前輩門的觀點來闡述抽象類和接口 這個東西了吧。