天天看點

C#中抽象類和接口的差別

大家在程式設計時都容易把抽象類和接口搞混,下面為大家從概念上講解抽象類和接口的差別:

     一、抽象類:

     含有abstract修飾符的class即為抽象類,抽象類是特殊的類,隻是不能被執行個體化,可以建立一個變量,其類型是一個抽象類,并讓它指向具體子類的一個執行個體;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法隻能聲明于抽象類中,且不包含任何實作,派生類必須覆寫它們。另外,抽象類可以派生自一個抽象類,可以覆寫基類的抽象方法也可以不覆寫。

    二、接口:

    接口是引用類型的,類似于類,和抽象類的相似之處有三點:     1、不能執行個體化;     2、包含未實作的方法聲明;     3、派生類必須實作未實作的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);

    接口有如下特性:

    接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜态成員。一個類可以直接繼承多個接口,但隻能直接繼承一個類(包括抽象類)。  

   兩者的文法差別:

    1.抽象類可以有構造方法,接口中不能有構造方法。

    2.抽象類中可以有普通成員變量,接口中沒有普通成員變量

    3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。

    4. 抽象類中的抽象方法的通路類型可以是public,protected,但接口中的抽象方法隻能是public類型的,并且預設即為public abstract類型。

    5. 抽象類中可以包含靜态方法,接口中不能包含靜态方法

    6. 抽象類和接口中都可以包含靜态成員變量,抽象類中的靜态成員變量的通路類型可以任意,但接口中定義的變量隻能是public static final類型,并且預設即為public static final類型。

    7. 一個類可以實作多個接口,但隻能繼承一個抽象類。

   8.接口可以用于支援回調,而繼承并不具備這個特點.    9.抽象類實作的具體方法預設為虛的,但實作接口的類中的接口方法卻預設為非虛的,當然您也可以聲明為虛的.  

   抽象類和接口的使用:

  1.如果預計要建立元件的多個版本,則建立抽象類。抽象類提供簡單的方法來控制元件版本。   2.如果建立的功能将在大範圍的全異對象間使用,則使用接口。如果要設計小而簡練的功能塊,則使用接口。   3.如果要設計大的功能單元,則使用抽象類.如果要在元件的所有實作間提供通用的已實作功能,則使用抽象類。   4.抽象類主要用于關系密切的對象;而接口适合為不相關的類提供通用功能。

  5.好的接口定義應該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類隻是實作了這個接口的中一個功能,而不得不去實作接口中的其他方法,就叫接口污染。