首先感謝園裡的一位前輩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 修飾符。