抽象類與介面的區別
* 抽象類與介面的區別
*
相同點
●都不能被直接例項化,都可以通過繼承實現其抽象方法。
●都是面向抽象程式設計的技術基礎,實現了諸多的設計模式。
不同點
●介面支援多繼承;抽象類不能實現多繼承。
●介面只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
●介面是一組行為規範;抽象類是一個不完全的類,著重族的概念。
●介面可以用於支援回撥;抽象類不能實現回撥,因為繼承不支援。
●介面只包含方法、屬性、索引器、事件的簽名,但不能定義欄位和包含實現的方法;抽象類可以定義欄位、屬性、
* 包含有實現的方法。
●介面可以作用於值型別和引用型別;抽象類只能作用於引用型別。例如,Struct就可以繼承介面,而不能繼承類。
通過相同與不同的比較,我們只能說介面和抽象類,各有所長,但無優略。在實際的程式設計實踐中,
* 我們要視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,
* 很多都來源於經典,我相信經得起考驗。所以在規則與場合中,我們學習這些經典,最重要的是學以致用,
* 當然我將以一家之言博大家之笑,看官請繼續。
規則與場合
1.請記住,物件導向思想的一個最重要的原則就是:面向介面程式設計。
2.藉助介面和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象程式設計。
3.抽象類應主要用於關係密切的物件,而介面最適合為不相關的類提供通用功能。
4.介面著重於CAN-DO關係型別,而抽象類則偏重於IS-A式的關係;
5.介面多定義物件的行為;抽象類多定義物件的屬性;
6.介面定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的介面都定義為public,
* 原因就不必多說了。
7.“介面不變”,是應該考慮的重要因素。所以,在由介面增加擴充套件時,應該增加新的介面,而不能更改現有介面。
8.儘量將介面設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IComparable、IEquatable、
* IEnumerable等都只包含一個公共方法。
9.介面名稱前面的大寫字母“I”是一個約定,正如欄位名以下劃線開頭一樣,請堅持這些原則。
10.在介面中,所有的方法都預設為public。
11.如果預計會出現版本問題,可以建立“抽象類”。例如,建立了狗(Dog)、雞(Chicken)和鴨(Duck),
* 那麼應該考慮抽象出動物(Animal)來應對以後可能出現風馬牛的事情。而向介面中新增新成員則會強制要求
* 修改所有派生類,並重新編譯,所以版本式的問題最好以抽象類來實現。
12.從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
13.對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被例項化。
14.在抽象方法宣告中不能使用 static 或 virtual 修飾符。
*
相同點
●都不能被直接例項化,都可以通過繼承實現其抽象方法。
●都是面向抽象程式設計的技術基礎,實現了諸多的設計模式。
不同點
●介面支援多繼承;抽象類不能實現多繼承。
●介面只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
●介面是一組行為規範;抽象類是一個不完全的類,著重族的概念。
●介面可以用於支援回撥;抽象類不能實現回撥,因為繼承不支援。
●介面只包含方法、屬性、索引器、事件的簽名,但不能定義欄位和包含實現的方法;抽象類可以定義欄位、屬性、
* 包含有實現的方法。
●介面可以作用於值型別和引用型別;抽象類只能作用於引用型別。例如,Struct就可以繼承介面,而不能繼承類。
通過相同與不同的比較,我們只能說介面和抽象類,各有所長,但無優略。在實際的程式設計實踐中,
* 我們要視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,
* 很多都來源於經典,我相信經得起考驗。所以在規則與場合中,我們學習這些經典,最重要的是學以致用,
* 當然我將以一家之言博大家之笑,看官請繼續。
規則與場合
1.請記住,物件導向思想的一個最重要的原則就是:面向介面程式設計。
2.藉助介面和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象程式設計。
3.抽象類應主要用於關係密切的物件,而介面最適合為不相關的類提供通用功能。
4.介面著重於CAN-DO關係型別,而抽象類則偏重於IS-A式的關係;
5.介面多定義物件的行為;抽象類多定義物件的屬性;
6.介面定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的介面都定義為public,
* 原因就不必多說了。
7.“介面不變”,是應該考慮的重要因素。所以,在由介面增加擴充套件時,應該增加新的介面,而不能更改現有介面。
8.儘量將介面設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IComparable、IEquatable、
* IEnumerable等都只包含一個公共方法。
9.介面名稱前面的大寫字母“I”是一個約定,正如欄位名以下劃線開頭一樣,請堅持這些原則。
10.在介面中,所有的方法都預設為public。
11.如果預計會出現版本問題,可以建立“抽象類”。例如,建立了狗(Dog)、雞(Chicken)和鴨(Duck),
* 那麼應該考慮抽象出動物(Animal)來應對以後可能出現風馬牛的事情。而向介面中新增新成員則會強制要求
* 修改所有派生類,並重新編譯,所以版本式的問題最好以抽象類來實現。
12.從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
13.對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被例項化。
14.在抽象方法宣告中不能使用 static 或 virtual 修飾符。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-444286/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中抽象類與介面的區別Java抽象
- Java:面試題:抽象類與介面的區別Java面試題抽象
- Java中抽象類和介面的區別Java抽象
- Java中抽象類和介面的介紹及二者間的區別Java抽象
- 【Java基本功】聊聊抽象類和介面的區別Java抽象
- 介面和抽象類的區別抽象
- 介面的行為抽象和抽象類的行為抽象抽象
- Java基礎10 介面的繼承與抽象類Java繼承抽象
- 運維和開發知識,Java中的抽象類和介面的兩大區別!運維Java抽象
- java基礎總結(面試高頻問題)十:java抽象類和介面的區別Java面試抽象
- 關於抽象類和介面的初步理解抽象
- 走進C# abstract,瞭解抽象類與介面的異同C#抽象
- 抽象類與介面抽象
- java-介面和抽象類的聯絡和區別。Java抽象
- java 設計模式6原則 介面,抽象類區別Java設計模式抽象
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- Java 8 中的抽象類和介面到底有啥區別?Java抽象
- JQ操作類與JS操作類的區別JS
- npm與cnpm的區別介紹NPM
- LCD1602和12864中8080和6800介面的區別
- Java總結-抽象類與介面Java抽象
- java中的抽象類與介面Java抽象
- Java的抽象類與介面理解Java抽象
- 偽類與偽元素的區別
- 抽象方法和抽象類抽象
- 抽象類抽象
- PHP 抽象類繼承抽象類時的注意點PHP 抽象類繼承抽象類時的注意點PHP抽象繼承
- FTP和TFTP的區別與介紹FTP
- 抽象類練習_學生與工人抽象
- IPEX幾代介面的區別
- StringUtils類中isEmpty與isBlank的區別
- Java中類與物件的關係與區別Java物件
- C#中抽象方法與虛方法的區別詳解及示例C#抽象
- 一文打盡Java抽象類和介面的相關問題Java抽象
- Java中的介面與抽象類詳解Java抽象
- PHP中的抽象類、介面與性狀PHP抽象
- Python抽象類Python抽象
- Java 抽象類Java抽象
- 14、抽象類抽象