1.與Java不同,C#中的接口不能包含字段(Field)。
在java中,接口中可以包含字段,但是這些字段隱式地是static和final的。而C#不允許接口中有字段,編譯器在編譯時就會提示錯誤(如下代碼所示)。
interface IInterface
{ int a ;//編譯器錯誤提示:接口不能包含字段 }
2、在C#和Java中,接口內的所有方法默認都是公用方法。
在Java中,方法聲明可以帶有public修飾符(即使這並非必要),但在C#中,顯式地為接口中的方法指定public修飾符是非法的。例如,下面的代碼將產生一個編譯錯誤。
interface IInterface { public int add();//錯誤提示:修飾符“public”對該項無效 }
3、C#中特有的實現接口和顯式實現接口.
普通實現接口
interface IInterface { int add(int a,int b) ; } class Program:IInterface { static void Main(string[] args) { Program ii = new Program(); //使用實體類來訪問自己的接口函數 Console.WriteLine(ii.add(1, 2));//正確運行,沒有提示錯誤 } public int add(int a, int b) { return a + b; } }
顯示地實現接口
interface IInterface { int add(int a,int b) ;//編譯器錯誤提示:接口不能包含字段 } class Program:IInterface { static void Main(string[] args) { Program newProgram = new Program(); newProgram.add(1, 2);//編譯器提示錯誤:“ConsoleApplication3.Program”不包含“add”的定義, //並且找不到可接受類型為“ConsoleApplication3.Program”的第一個參數的擴展方法“add”(是否缺少 using 指令或程序集引用?) } int IInterface.add(int a, int b)//顯示實現接口,注意這個方法多了IIterface限定符 { return a + b; } }
另外,我們注意到顯式實現接口后int IInterface.add(int a, int b)中少了public修飾符,但是我們一加上編譯器又會提示錯誤:“修飾符“public”對該項無效”。另外因為是Program類訪問自身的方法,所以訪問性也不是構成add()方法無法訪問的原因。
如果我們將main()函數中的代碼修改一下,將new Program()的變量賦給IIterface的引用,再看看結果如何
static void Main(string[] args) { IInterface ii = new Program(); Console.WriteLine(ii.add(1, 2));//正確運行,沒有提示錯誤 }
從以上結果,我們可以看出如果是顯示實現接口,那么對接口中方法的訪問必須要通過接口類型的引用,用顯示實現了接口的類是沒有辦法使用的。
顯式接口成員實現的兩個主要用途
· 由於顯式接口成員實現不能通過類或結構實例來訪問,因此它們就不屬於類或結構的自身的公共接口。當需在一個公用的類或結構中實現一些僅供內部使用(不允許外界訪問)的接口時,這就特別有用。
· 顯式接口成員實現可以消除因同時含有多個相同簽名的接口成員所引起的多義性。如果沒有顯式接口成員實現,一個類或結構就不可能為具有相同簽名和返回類型的接口成員分別提供相應的實現,也不可能為具有相同簽名和不同返回類型的所有接口成員中的任何一個提供實現。