接口就是為了約束方法的格式(參數和返回值類型)而存在的
接口可以實現多繼承,彌補單繼承的缺陷。
接口可以看成是一個特殊的抽象類,通過反編譯看源碼可知
接口中方法不用訪問修飾符,因為CLR會自動添加,並且不能有方法體
如果一個類實現了某個接口,就得實現該接口中所有的方法
接口要謹慎使用,防止出現接口污染!
接口僅僅代表一種能力,實現該接口的類和接口沒有繼承關系。
接口是用來實現的,類是用來繼承的。
其實很多時候,看似可以不用接口,因為接口就是一個方法的約定,
表明你這個類必須要有某些方法,但是不寫接口也可以有這些方法,用了接口,
就可以使用接口變量,統一調用,實現多態。
抽象類和接口的區別
當需要的各個對象之間存在父子類關系時,可以考慮使用抽象類,
當各個對象之間不存在繼承關系,只是有相同的能力時,而已考慮使用接口
接口的通俗理解
飛機會飛,鳥會飛,他們都繼承了同一個接口“飛”;但是F22屬於飛機抽象類,鴿子屬於鳥抽象類。
就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承)。
一個門可以有鎖(接口)也可以有門鈴(多實現)。
門(抽象類)定義了你是什麼,接口(鎖)規定了你能做什麼
(一個接口最好只能做一件事,你不能要求鎖也能發出聲音吧(注意避免接口污染))
接口總結(摘錄):
接口是組件之間的協議,描述了組件對外提供的服務。從技術上講接口是一組包含了函數型方法的數據結構。 通過這組數據結構,客戶代碼可以調用組件對象的功能。接口可以從父接口中繼承。接口的繼承首先是說明性繼承,不是實現性繼承,它的實現需要通過類或結構來實現;其次接口繼承可以是多繼承。
屬性的本質是方法,索引器的本質是屬性。
接口包含的成員有方法、屬性、索引指示器和事件。由於接口允許多繼承,在可能發生二義性的地方可以采用全權名來避免。可以用類來實現接口。在類中定位接口成員的實現稱之為接口映射。類必須為接口的所有成員提供具體的實現,包括接口中顯式定義的成員, 以及接口從父接口中繼承而來的成員。同樣,在對接口的實現過程中可以采用顯式接口成員執行體來避免產生二義性。派生類可以對基類已經實現的接口進行重實現。
抽象類也可以實現接口,但接口成員必須映射到抽象類的抽象成員。抽象類的派生類如果是非抽象類,則必須通過方法重載來實現接口成員。
接口實例
//某些動物或者物體具有飛這一行為,定義IFly 飛行接口 public interface IFly { //01.接口只是用來規范實現該接口的類中方法的格式,相當於是一個規范的制定者 //02.接口中的方法不能有方法體,而且接口中的方法不用訪問修飾符 //03.在沒有繼承關系的多個類中,實現多態,接口是一種處理方案 //04.接口中只能定義方法,不能定義變量。string Fly(); }
//鳥類 實現了IFly這一接口 public class Birds:IFly { public string Fly() { return "I Can Fly"; } }
//飛機同樣也能飛 public class Plane:IFly { public string Fly() { return "飛機飛"; } }
//在我們的方法中進行使用 static void Main(string[] args) { //通過接口如何實現多態?? IFly[] flys = { new Birds(), new Plane() }; foreach (IFly fly in flys) { Console.WriteLine(fly.Say("接口實例")); } Console.ReadKey(); }