相同點
●都不能被直接例項化,都可以通過繼承實現其抽象方法。
●都是面向抽象程式設計的技術基礎,實現了諸多的設計模式。
不同點
●介面支援多繼承;抽象類不能實現多繼承。
●介面只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
●介面是一組行為規範;抽象類是乙個不完全的類,著重族的概念。
●介面可以用於支援**;抽象類不能實現**,因為繼承不支援。
●介面只包含方法、屬性、索引器、事件的簽名,但不能定義欄位和包含實現的方法;抽象類可以定義字段、屬性、包含有實現的方法。
●介面可以作用於值型別和引用型別;抽象類只能作用於引用型別。例如,struct就可以繼承介面,而不能繼承類。
通過相同與不同的比較,我們只能說介面和抽象類,各有所長,但無優略。在實際的程式設計實踐中,我們要視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,很多都**於經典,我相信經得起考驗。所以在規則與場合中,我們學習這些經典,最重要的是學以致用,當然我將以一家之言博大家之笑,看官請繼續。
規則與場合
1.請記住,物件導向思想的乙個最重要的原則就是:面向介面程式設計。
2.借助介面和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象程式設計。
3.抽象類應主要用於關係密切的物件,而介面最適合為不相關的類提供通用功能。
4.介面著重於can-do關係型別,而抽象類則偏重於is-a式的關係;
5.介面多定義物件的行為;抽象類多定義物件的屬性;
6.介面定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的介面都定義為public,原因就不必多說了。
7.「介面不變」,是應該考慮的重要因素。所以,在由介面增加擴充套件時,應該增加新的介面,而不能更改現有介面。
8.盡量將介面設計成功能單一的功能塊,以.net framework為例,idisposable、idisposable、icomparable、iequatable、ienumerable等都只包含乙個公共方法。
9.介面名稱前面的大寫字母「i」是乙個約定,正如欄位名以下劃線開頭一樣,請堅持這些原則。
10.在介面中,所有的方法都預設為public。
11.如果預計會出現版本問題,可以建立「抽象類」。例如,建立了狗(dog)、雞(chicken)和鴨(duck),那麼應該考慮抽象出動物(animal)來應對以後可能出現風馬牛的事情。而向介面中新增新成員則會強制要求修改所有派生類,並重新編譯,所以版本式的問題最好以抽象類來實現。
12.從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
13.對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被例項化。
14.在抽象方法宣告中不能使用 static 或 virtual 修飾符。
以上的規則,我就厚顏無恥的暫定為t14條吧,寫的這麼累,就當一時的獎賞吧。大家也可以互通有無,我將及時修訂。
抽象類和介面的比較
1.抽象類 是一種特殊的類,具有以下特點 a 抽象方法只作宣告,而不包括實現,可以是看成沒有實現體的虛方法。b 抽象類不能被例項化,除此之外,具有類的其他特性。c 抽象類可以但不是不惜具有抽象方法和抽象方法,但是一旦有了抽象方法,就一定要把這個類宣告為抽象類。d 具體派生類必須覆蓋抽象類的抽象方法。...
抽象類和介面的比較
包含乙個抽象方法的類必須是抽象類 抽象類和抽象方法都要使用abstract關鍵字宣告 抽象方法只需要宣告而不需要實現 抽象類必須被繼承,子類 如果不是抽象類 必須覆寫抽象類中的全部抽象方法 注意 抽象方法不要用private宣告,如果使用private宣告,子類將無法覆寫 ps 抽象類允許構造方法,...
抽象類和介面的比較
介面和抽象類是非常相似的,但是他們之間是有區別的,主要區別一下幾個方面 1 乙個類可以實現眾多個介面,但是只能繼承乙個抽象類,可以說介面是取消程式語言中的多繼承機制的乙個衍生物,但是不完全如此 2 抽象類可以有非抽象方法,既可以有已經實現的方法,繼承他的子類可以對方法進行覆寫 而介面中定義的餓方法必...