標籤:
介面與抽象類別是面試中經常會考到的點,容易混淆。首先瞭解下兩者的概念:
一、抽象類別:
抽象類別是特殊的類,只是不能被執行個體化;除此以外,具有類的其他特性;重要的是抽象類別可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類別中,且不包含任何實現,衍生類別必須覆蓋它們。另外,抽象類別可以派生自一個抽象類別,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其衍生類別必須覆蓋它們。
二、介面:
介面是參考型別的,類似於類,和抽象類別的相似之處有三點:
1、不能執行個體化;
2、包含未實現的方法聲明;
3、衍生類別必須實現未實現的方法,抽象類別是抽象方法,介面則是所有成員(不僅是方法包括其他成員);
另外,介面有如下特性: 介面除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、建構函式、解構函式、靜態成員。一個類可以直接繼承多個介面,但只能直接繼承一個類(包括抽象類別)。
詳細的,定義上的區別分析,可以參考此篇部落格:http://www.cnblogs.com/lovemyth/archive/2008/09/08/828909.html
這裡概括、形象化地解釋一下介面和抽象類別的區別:
介面主要是對行為的抽象;抽象類別主要是對類的抽象。
更加形象的比喻如下:
1.飛機會飛,鳥會飛,他們都繼承了同一個介面“飛”;但是F22屬于飛機抽象類別,鴿子屬於鳥抽象類別。
2. 就像鐵門木門都是門(抽象類別),你想要個門我給不了(不能執行個體化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(介面)也可以有門鈴(多實現)。 門(抽象類別)定義了你是什麼,介面(鎖)規定了你能做什麼(一個介面最好只能做一件事,你不能要求鎖也能發出聲音吧(介面汙染))。
代碼級的區別展示:
一、抽象類別:
抽象類別裡面可以包括部分具體實現,而介面則不行。
public abstract class AClass{ private int x; private int y; public int X { get { return x; } } public int Y { get { return y; } } public float Sum() { return X + Y; } public abstract float Average();} public class BClass : AClass{ public override float Average() { return Sum() / 2; }}
如上面的例子,在抽象類別中,實際包括了:幾處具體的實現,二個屬性,一個求和方法。
同時對於介面來說,根本就無法定義欄位成員,也就是private int x,private int y;它是無法定義的。
二、介面:
對於介面實現同樣的功能,你只能做到:
public interface A{ public int X{get;} public int Y{get;} public float Sum();}
你無法提供Sum的任何功能。
小結:
1、我們在理解一門技術上,首先可以從其用處上來考慮,要認識到這門技術是做什麼用的。這樣才能加深對於知識的理解。後續項目中使用到了介面和抽象類別會繼續完善此文檔。
2、文章僅僅是自己的總結與體會(包括粘貼),希望能為大家提供到協助。感謝CSDN的phy,和CNBLOG使用者殘葉。
C#中介面與抽象類別的區別