抽象類:抽象類是特殊的類,只是不能被實例化(將定義了一個或多個純虛函數的類稱為抽象類);除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的,但同時也能包括普通的方法。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。雖然不能定義抽象類的實例,但是可以定義它的指針,並且指向抽象類的指針實際上在賦值時是指向其繼承類的實例化對象的,這樣通過統一的使用該指針可以很好的封裝不同子類的實現過程,這在模式設計的過程中得到了極大的應用!
接口:接口是一個概念。它在C++中用抽象類來實現,在C#和Java中用interface來實現。
接口是引用類型的,類似於類,和抽象類的相似之處有三點:
1、不能實例化;
2、包含未實現的方法聲明;
3、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
另外,接口有如下特性:
接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。
抽象類和接口的區別:
1.接口和抽象類的概念不一樣。接口是對動作的抽象,抽象類是對根源的抽象。抽象類表示的是,這個對象是什么。接口表示的是,這個對象能做什 么。比如,男人,女 人,這兩個類(如果是類的話……),他們的抽象類是人。說明,他們都是人人可以吃東西,狗也可以吃東西, 你可以把“吃 東西”定義成一個接口,然后讓這些類去實 現它.所以,在高級語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時 是生物和非生物),但 是可以實現多個接口(吃飯接口、走路接口)。
2.抽象類在定義類型方法的時候,可以給出方法的實現部分,也可以不給出;而對於接口來說,其中所定義的方法都不能給出實現部分。
3.繼承類對於兩者所涉及方法的實現是不同的。繼承類對於抽象類所定義的抽象方法,可以不用重寫,也就是說,可以延用抽象類的方法;而對於接口類所定義的方法或者屬性來說,在繼承類中必須要給出相應的方法和屬性實現。
4.接口可以用於支持回調,而繼承並不具備這個特點.
5.抽象類不能被密封,一個類一次可以實現若干個接口,但是只能擴展一個(抽象類)父類 ;。
6.抽象類實現的具體方法默認為虛的,但實現接口的類中的接口方法卻默認為非虛的,當然您也可以聲明為虛的.
7.(接口)與非抽象類類似,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實現。但是,允許抽象類將接口方法映射到抽象方法上。
8.抽象類實現了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的座位子類去實現。
9.好的接口定義應該是具有專一功能性的,而不是多功能的,否則造成接口污染。(如果一個類只是為實現了這個接口的中一個功能,而但是卻不得不去實現接口中的其他方法,就叫接口污染。 )
10.盡量避免使用繼承來實現組建功能,而是使用黑箱復用,即對象組合。因為繼承的層次增多,造成最直接的后果就是當你調用這個類群中某一 類,就必須把他們全部加載到棧中!后果可想而知.(結合堆棧原理理解)。同時,有心的朋友可以留意到微軟在構建一個類時,很多時候用 到了對象組合的方法。比如asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調 用另外的類的方法和屬性,這個是非常基本的一個設計原則。
11.如果抽象類實現接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現接口中方法.
轉載地址:http://blog.csdn.net/bmzyDream_007/article/details/4157560
|
|
接口 |
抽象類 |
| 多繼承 |
支持 |
不支持 |
| 類型限制 |
沒有 |
有,只能是引用類型 |
| 方法實現 |
繼承類型中必須給出方法實現 |
繼承類中可以不給出 |
| 擴展性 |
比較麻煩 |
相對比較靈活 |
| 多層繼承 |
比較麻煩,需要借助虛函數 |
比較靈活 |
