接口與抽象類是面試中經常會考到的點,容易混淆。首先了解下兩者的概念:
一、抽象類:
抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。
二、接口:
接口是引用類型的,類似於類,和抽象類的相似之處有三點:
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用戶殘葉。