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