轉自:http://www.cnblogs.com/ArmyShen/archive/2012/09/04/2669809.htmlhtml
***接口是對方法的抽象,而對象是對類的抽象ide
接口的規定:函數
(1)接口(interface)定義了一個可由類和結構實現的協定post
(2)接口能夠包含方法、屬性、事件和索引器spa
(3)全部接口都隱式具備public訪問屬性code
(4)接口不能包含常量、字段、運算符、構造函數、析構函數、類型htm
(5)接口不能包含abstract、public、protected、internal、private、virtual、override、static修飾符對象
(6)接口不提供它所定義的成員的具體實現blog
(7)一個類若是繼承了接口,那麼該類必須實現接口中的所有方法,包括這個接口的基接口繼承
(8)接口能夠實現多重繼承
一、聲明一個接口
//interface關鍵字定義一個接口,一般以I + Name命名接口 interface IMyInterface { void fun(); }
二、接口與其基類方法存在同名的問題
interface IMyFirstInterface { void Func(); } //Second繼承了First interface IMySecondInterface : IMyFirstInterface { //此時若是Second中具備和First中同名的方法,須要加new關鍵字 new void Func(); }
//類A繼承了Second接口,那麼它也要實現Second所繼承的First接口中的方法 class A:IMySecondInterface {
//由於Second和First接口中的方法同名,因此此時First中的同名方法將被覆蓋,這裏實現的實際上是Second中的方法 void Func() { } } public class Test { static void Main() { A a = new A(); a.Func(); } }
三、顯示接口成員實現(解決2出現的同名覆蓋問題)
interface IMyFirstInterface { void Func(); } interface IMySecondInterface : IMyFirstInterface { new void Func(); } class A:IMySecondInterface { //使用徹底限定接口成員名做爲標示符,能夠解決繼承接口相同名稱覆蓋的問題,此時這種實現的接口並不屬於類的成員,僅是對接口方法的實現,因此不能使用public修飾其訪問權限
//實現的是First接口中的方法 void IMyFirstInterface.Func() { Console.WriteLine("First"); } //實現的是Second中的方法 void IMySecondInterface.Func() { Console.WriteLine("Second"); } } public class Test { static void Main() { A a = new A();
//在調用方法時,不能直接使用類的對象去調用其所實現的接口方法,只能顯示的使用接口名進行訪問,這也證明了這些方法不屬於類的自己 ((IMyFirstInterface)a).Func(); ((IMySecondInterface)a).Func(); } }
四、接口間的多重繼承
interface IA { void F(); } interface IB : IA { new void F(); } interface IC : IA { void G(); } interface ID : IB,IC { } class MyClass:ID { //類繼承了ID接口,因此同時要實現ID所繼承的接口(IB,IC)中的方法 public void F() { Console.WriteLine("IB.F()"); } public void G() { } } public class Test { static void Main() { MyClass c = new MyClass(); c.F();//調用IB中的F()方法,由於類所繼承的ID接口同時繼承於IB接口 ((IA)c).F();//調用IB中的F()方法,ID首先會到它繼承的接口IB中查找F()方法,雖然IA中存在同名方法,但此時IA中的同名方法被覆蓋,也就是說IB到IA的路徑被隱藏 ((IB)c).F();//調用IB中的F()方法,類原本就是對IB中的方法進行了實現 ((IC)c).F();//調用IB中的F()方法,多重繼承的直觀隱藏規則:若是成員在任何一個訪問路徑中被隱藏,那麼它在全部的訪問路徑中都被隱藏 ((ID)c).F();//調用IB中的F()方法,由於ID繼承了IB中的方法 } }