聲明方法的存在而不去實現它的類被叫作抽象類(abstract class),它用於要建立一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract 類的實例。然而能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的全部抽象方法提供實現,不然它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類能夠在類中實現這些方法。
接口(interface)是抽象類的變體。在接口中,全部方法都是抽象的。多繼承性可經過實現這樣的接口而得到。接口中的全部方法都是抽象的,沒有一個有程序體。接口只能夠定義static final成員變量。接口的實現與子類類似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)全部這種接口的方法。而後,它能夠在實現了該接口的類的任何對象上調用接口的方法。因爲有抽象類,它容許使用接口名做爲引用變量的類型。一般的動態聯編將生效。引用能夠轉換到接口類型或從接口類型轉換,instanceof 運算符能夠用來決定某對象的類是否實現了接口。
1抽象類
(1) 抽象方法只做聲明,而不包含實現,能夠當作是沒有實現體的虛方法
(2) 抽象類不能被實例化
(3) 抽象類能夠但不是必須有抽象屬性和抽象方法,可是一旦有了抽象方法,就必定要把這個類聲明爲抽象類
(4) 具體派生類必須覆蓋基類的抽象方法
(5) 抽象派生類能夠覆蓋基類的抽象方法,也能夠不覆蓋。若是不覆蓋,則其具體派生類必須覆蓋它們。如:
using System; public abstract class A //抽象類A { private int num=0; public int Num //抽象類包含屬性 { get { return num; } set { num = value; } } public virtual int getNum() //抽象類包含虛方法 { return num; } public void setNum(int n) // //抽象類包含普通方法 { this.num = n; } public abstract void E(); //類A中的抽象方法E } public abstract class B : A //因爲類B繼承了類A中的抽象方法E,因此類B也變成了抽象類 { } public class C : B { public override void E() //重寫從類A繼承的抽象方法。若是類B本身還定義了抽象方法,也必須重寫 { //throw new Exception("The method or operation is not implemented."); } } public class Test { static void Main() { C c = new C(); c.E(); } }
2、接 口
(1) 接口不能被實例化
(2) 接口只能包含方法聲明
(3) 接口的成員包括方法、屬性、索引器、事件
(4) 接口中不能包含常量、字段(域)、構造函數、析構函數、靜態成員。如:html
public delegate void EventHandler(object sender, Event e); public interface ITest { //int x = 0; int A { get; set; } void Test(); event EventHandler Event; int this[int index] { get; set; } }
(5) 接口中的全部成員默認爲public,所以接口中不能有private修飾符
(6) 派生類必須實現接口的全部成員
(7) 一個類能夠直接實現多個接口,接口之間用逗號隔開
(8) 一個接口能夠有多個父接口,實現該接口的類必須實現全部父接口中的全部成員
3、抽象類和接口
相同點:
(1) 均可以被繼承
(2) 都不能被實例化
(3) 均可以包含方法聲明
(4) 派生類必須實現未實現的方法
區別:
(1) 抽象基類能夠定義字段、屬性、方法實現。接口只能定義屬性、索引器、事件、和方法聲明,不能包含字段。
(2) 抽象類是一個不完整的類,須要進一步細化,而接口是一個行爲規範。微軟的自定義接口老是後帶able字段,證實其是表述一類「我能作。。。」
(3) 接口能夠被多重實現,抽象類只能被單一繼承
(4) 抽象類更多的是定義在一系列緊密相關的類間,而接口大多數是關係疏鬆但都實現某一功能的類中
(5) 抽象類是從一系列相關對象中抽象出來的概念, 所以反映的是事物的內部共性;接口是爲了知足外部調用而定義的一個功能約定, 所以反映的是事物的外部特性
(6) 接口基本上不具有繼承的任何具體特色,它僅僅承諾了可以調用的方法
(7) 接口能夠用於支持回調,而繼承並不具有這個特色
(8) 抽象類實現的具體方法默認爲虛的,但實現接口的類中的接口方法卻默認爲非虛的,固然您也能夠聲明爲虛的
(9) 若是抽象類實現接口,則能夠把接口中方法映射到抽象類中做爲抽象方法而沒必要實現,而在抽象類的子類中實現接口中方法設計模式
出處:http://www.cnblogs.com/zhangchenliang/p/4661736.htmlasp.net
========================================================================================================ide
你們都容易把這二者搞混,我也同樣,在聽李建忠老師的設計模式時,他也老把抽象類說成接口,弄的我就更糊塗了,因此找了些網上的資料.
1、抽象類:
抽象類是特殊的類,只是不能被實例化;除此之外,具備類的其餘特性;重要的是抽象類能夠包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類能夠派生自一個抽象類,能夠覆蓋基類的抽象方法也能夠不覆蓋,若是不覆蓋,則其派生類必須覆蓋它們。函數
2、接口:
接口是引用類型的,相似於類,和抽象類的類似之處有三點:
一、不能實例化;
二、包含未實現的方法聲明;
三、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是全部成員(不只是方法包括其餘成員);oop
另外,接口有以下特性:
接口除了能夠包含方法以外,還能夠包含屬性、索引器、事件,並且這些成員都被定義爲公有的。除此以外,不能包含任何其餘的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類能夠直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。
3、抽象類和接口的區別:
1.類是對對象的抽象,能夠把抽象類理解爲把類看成對象,抽象成的類叫作抽象類.而接口只是一個行爲的規範或規定,微軟的自定義接口老是後帶able字段,證實其是表述一類類「我能作。。。」.抽象類更多的是定義在一系列緊密相關的類間,而接口大多數是關係疏鬆但都實現某一功能的類中.
2.接口基本上不具有繼承的任何具體特色,它僅僅承諾了可以調用的方法;
3.一個類一次能夠實現若干個接口,可是隻能擴展一個父類
4.接口能夠用於支持回調,而繼承並不具有這個特色.
5.抽象類不能被密封。
6.抽象類實現的具體方法默認爲虛的,但實現接口的類中的接口方法卻默認爲非虛的,固然您也能夠聲明爲虛的.
7.(接口)與非抽象類相似,抽象類也必須爲在該類的基類列表中列出的接口的全部成員提供它本身的實現。可是,容許抽象類將接口方法映射到抽象方法上。
8.抽象類實現了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義爲不可變的,而把可變的座位子類去實現。
9.好的接口定義應該是具備專注功能性的,而不是多功能的,不然形成接口污染。若是一個類只是實現了這個接口的中一個功能,而不得不去實現接口中的其餘方法,就叫接口污染。
10.儘可能避免使用繼承來實現組建功能,而是使用黑箱複用,即對象組合。由於繼承的層次增多,形成最直接的後果就是當你調用這個類羣中某一類,就必須把他們所有加載到棧中!後果可想而知.(結合堆棧原理理解)。同時,有心的朋友能夠留意到微軟在構建一個類時,不少時候用到了對象組合的方法。好比asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調用另外的類的方法和屬性,這個是很是基本的一個設計原則。
11.若是抽象類實現接口,則能夠把接口中方法映射到抽象類中做爲抽象方法而沒必要實現,而在抽象類的子類中實現接口中方法.
4、抽象類和接口的使用:
1. 若是預計要建立組件的多個版本,則建立抽象類。抽象類提供簡單的方法來控制組件版本。
2.若是建立的功能將在大範圍的全異對象間使用,則使用接口。若是要設計小而簡練的功能塊,則使用接口。
3.若是要設計大的功能單元,則使用抽象類.若是要在組件的全部實現間提供通用的已實現功能,則使用抽象類。
4.抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。
如下是我在網上看到的幾個形象比喻,真的很是不錯,呵呵:
1.飛機會飛,鳥會飛,他們都繼承了同一個接口「飛」;可是F22屬於飛機抽象類,鴿子屬於鳥抽象類。
2. 就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我能夠給你個具體的鐵門或木門(多態);並且只能是門,你不能說它是窗(單繼承);一個門能夠有鎖(接口)也能夠有門鈴(多實現)。 門(抽象類)定義了你是什麼,接口(鎖)規定了你能作什麼(一個接口最好只能作一件事,你不能要求鎖也能發出聲音吧(接口污染))。post
用一句話形容:Abstract is sth,Interface like sththis
出處:http://www.cnblogs.com/zhangchenliang/p/4719908.htmlspa