標籤:
C#中介面為"其他方面互不相干"的類型提供公用的服務和特徵;C#中class只支援但繼承,使用介面卻支援多繼承,例如:C#中System.String是從System空間中的4個interface繼承而來。
public sealed class String:ICompare,ICloneable,ICovertible,IEnumerable;C#中對class使用sealed關鍵字修飾,代表這個類不能夠被在其他類繼承。
接下來描述一下2者的區別:
1.兩者表達的概念不一樣,抽象類別是一類事物的高度彙總,那麼繼承子類相對這個抽象類別來說是一種"是"的關係,介面是定義行為的規範,因此實現介面的類相對於介面來說,"是行為需要按照介面來完成"。舉個例子,花是所有花類的統稱,牡丹是花,玫瑰是花,那麼花相對牡丹和玫瑰來說是抽象類別。而對於發出香味這一動作來說,香水也會發出香味。前者就是所說的抽象類別,後者就是所說的介面。
2.抽象類別在定義類型方法時候,可以給出實現部分,也可以不給出實現部分,而對於介面來說,其中所有的定義都不給出實現部分,例如:
public abstract DemoClass{ public virtual void VirtualTest() { Console.WriteLine("This is a virtual function"); } public abstract void AbstractTest();}public interface IDemoInterface{ void InterFaceTest(); void InteFaceDemo();}
View Code
3.繼承類對於2者所涉及的方法的實現是不同的。繼承類對於抽象類別所定義的抽象方法可以不需要重寫,也就是說可以沿用抽象類別的 方法,而對於介面來說,定義的介面或者屬性都必須在繼承類中給出相應的實現。
4.由區別3可以得出,如果在抽象類別中新增一個方法,繼承類可以不需要做改變,但是如果在介面中新增了一個介面方法,必須在子類 中做相應的變化,實現新增的方法。
接下來,簡單介紹一下介面相對於抽象類別的優劣:
1.介面不光可以作用於參考型別也可以作用於實值型別,抽象類別只能作用於參考型別 ;
2..NET的類型只能實現單繼承,但是介面可以實現多繼承;
3.介面類只定義類屬性和方法,而與真正的實作類別沒有太大關係,抽象類別與繼承類之間的關係就比較緊密了;
4.通過介面可以減少類型暴露的屬性和方法,從而便可以保護類型對象,一個實現介面的類型,可能包含其他方法或者屬性,但是方法 返回的時候,可以返回介面對象,這樣,調用端只能通過介面提供的方法或者屬性,訪問對象的相關元素,這樣可以有效保護對象的其 他元素;
5.減少實值型別的拆箱操作。對於Struct定義的實值型別資料,每從存放集合當中取出來,都需要進行拆箱操作,這時採用Struct+Interface 結合的方法,從而降低拆箱操作。
其實在繼承中,到底使用介面還是抽象類別。介面是固定的,約定俗成的,因此在繼承類中必須提供介面相應的方法和屬性的實現。而對於 抽象類別來說,抽象類別的定義方法的實現,貫穿整個繼承樹,因此其中方法的實現或者重寫都是不確定的。因此相對而言,抽象類別比介面更 靈活一些。
以下通過圖表簡單總結一下2者之間的差異:
淺談C#中的介面和抽象類別