標籤:style blog http color os ar 使用 sp strong
轉自:http://www.cnblogs.com/ArmyShen/archive/2012/09/04/2669809.html
***介面是對方法的抽象,而對象是對類的抽象
介面的規定:
(1)介面(interface)定義了一個可由類和結構實現的協定
(2)介面可以包含方法、屬性、事件和索引器
(3)所有介面都隱式具有public訪問屬性
(4)介面不能包含常量、欄位、運算子、建構函式、解構函式、類型
(5)介面不能包含abstract、public、protected、internal、private、virtual、override、static修飾符
(6)介面不提供它所定義的成員的具體實現
(7)一個類如果繼承了介面,那麼該類必須實現介面中的全部方法,包括這個介面的基底介面
(8)介面可以實現多重繼承
1、聲明一個介面
//interface關鍵字定義一個介面,通常以I + Name命名介面interface IMyInterface{ void fun();}
2、介面與其基類方法存在同名的問題
interface IMyFirstInterface{ void Func();}//Second繼承了Firstinterface 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(); }}
3、顯示介面成員實現(解決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(); }}
4、介面間的多重繼承
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中的方法 }}
C#介面