一抽象類
抽象類是特殊的類只是不能被實例化除此以外具有類的其他特性重要的是抽象類可以包括抽象方法這是普通類所不能的抽象方法只能聲明於抽象類中且不包含任何實現派生類必須覆蓋它們另外抽象類可以派生自一個抽象類可以覆蓋基類的抽象方法也可以不覆蓋如果不覆蓋則其派生類必須覆蓋它們
二接口
接口是引用類型的類似於類和抽象類的相似之處有三點
不能實例化
包含未實現的方法聲明
派生類必須實現未實現的方法抽象類是抽象方法接口則是所有成員(不僅是方法包括其他成員)
另外接口有如下特性
接口除了可以包含方法之外還可以包含屬性索引器事件而且這些成員都被定義為公有的除此之外不能包含任何其他的成員例如常量域構造函數析構函數靜態成員一個類可以直接繼承多個接口但只能直接繼承一個類(包括抽象類)
三抽象類和接口的區別
類是對對象的抽象可以把抽象類理解為把類當作對象抽象成的類叫做抽象類而接口只是一個行為的規范或規定微軟的自定義接口總是後帶able字段證明其是表述一類類我能做抽象類更多的是定義在一系列緊密相關的類間而接口大多數是關系疏松但都實現某一功能的類中
接口基本上不具備繼承的任何具體特點它僅僅承諾了能夠調用的方法;
一個類一次可以實現若干個接口但是只能擴展一個父類
接口可以用於支持回調而繼承並不具備這個特點
抽象類不能被密封
抽象類實現的具體方法默認為虛的但實現接口的類中的接口方法卻默認為非虛的當然您也可以聲明為虛的
(接口)與非抽象類類似抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實現但是允許抽象類將接口方法映射到抽象方法上
抽象類實現了oop中的一個原則把可變的與不可變的分離抽象類和接口就是定義為不可變的而把可變的座位子類去實現
好的接口定義應該是具有專一功能性的而不是多功能的否則造成接口污染如果一個類只是實現了這個接口的中一個功能而不得不去實現接口中的其他方法就叫接口污染
盡量避免使用繼承來實現組建功能而是使用黑箱復用即對象組合因為繼承的層次增多造成最直接的後果就是當你調用這個類群中某一類就必須把他們全部加載到棧中!後果可想而知(結合堆棧原理理解)同時有心的朋友可以留意到微軟在構建一個類時很多時候用到了對象組合的方法比如aspnet中Page類有Server Request等屬性但其實他們都是某個類的對象使用Page類的這個對象來調用另外的類的方法和屬性這個是非常基本的一個設計原則
如果抽象類實現接口則可以把接口中方法映射到抽象類中作為抽象方法而不必實現而在抽象類的子類中實現接口中方法
四抽象類和接口的使用
如果預計要創建組件的多個版本則創建抽象類抽象類提供簡單的方法來控制組件版本
如果創建的功能將在大范圍的全異對象間使用則使用接口如果要設計小而簡練的功能塊則使用接口
如果要設計大的功能單元則使用抽象類如果要在組件的所有實現間提供通用的已實現功能則使用抽象類
抽象類主要用於關系密切的對象而接口適合為不相關的類提供通用功能
以下是我在網上看到的幾個形象比喻真的非常不錯呵呵:
飛機會飛鳥會飛他們都繼承了同一個接口飛但是F屬於飛機抽象類鴿子屬於鳥抽象類
就像鐵門木門都是門(抽象類)你想要個門我給不了(不能實例化)但我可以給你個具體的鐵門或木門(多態)而且只能是門你不能說它是窗(單繼承)一個門可以有鎖(接口)也可以有門鈴(多實現) 門(抽象類)定義了你是什麼接口(鎖)規定了你能做什麼(一個接口最好只能做一件事你不能要求鎖也能發出聲音吧(接口污染)
From:http://tw.wingwit.com/Article/program/net/201311/15085.html