在C#中,可以在類、結構或接口中用this關鍵字聲明索引器,在索引器內部用get或set訪問器訪問類中集合的某項值。因此可以將索引器看作是類的屬性一樣去定義。索引器常用定義格式如下:
public int this[int index]{ get{ return 類內部的某個集合[index];} set{類內部的某個集合[index]=value;} }
索引器參數類型不只是整型,還可以用字符串,例如 public int this[string index]{.....}這樣的格式。
今天所要討論的是接口索引器,以及繼承接口的類在內部如何定義索引器,客戶端怎么調用這樣的索引器。
如果一個類,要繼承兩個接口,而這兩個接口里面都聲明了同樣類型的索引器,那么在這個類里面怎么去實現這兩個索引器呢?這種情況下,派生類必須使用接口成員的完全限定名來顯示實現接口的索引器。即在類中,this關鍵字前面必須加上接口名稱。我用vs2013測試了一下,如果存在這種索引器,那么還不能在索引器前面加上public訪問修飾符,不然編譯通不過。客戶端在調用類對象索引器的時候,如果不用接口去裝載類對象,編譯也不能通過,並顯示“錯誤 2 無法將帶 [] 的索引應用於“ConsoleAppTest.Program.Test”,這是因為類內部實現的是接口中的索引器,類沒有它自己的索引器,就像有點寄人籬下的感覺。如果不用接口去裝載類對象,需要直接用類名去實例化一個對象,這時類內部需要定義它自己的索引器才行。如下代碼所示:
public interface ITestOne { int this[int index]{get;set;} void Add(int value); } public interface ITestTwo { int this[int index] { get; set; } } //該類實現了接口的索引器,沒有自定義自己的索引器 //因此客戶端在調用的時候,需要用到接口去裝載類對象,才能使用接口索引器 //每個接口只管它自己內部所聲明的成員,如果調用了不屬於該接口的成員,編譯通不過。 public class Test : ITestOne, ITestTwo { private int[] items; public Test() { items=new int[10]; } private int length=0; public void Add(int value) { items[length++] = value; } public int Length { get { return length; } } //不能加入public訪問修飾符,否則編譯通不過 int ITestOne.this[int index] { get { return items[index]; } set { items[index] = value; } } //不能加入public訪問修飾符,否則編譯通不過 int ITestTwo.this[int index] { get { return items[index]; } set { items[index] = value; } } } void main(){ //如果用ITestTwo test = new Test();的話,編譯通不過 //因為ITestTwo接口不包含Add方法的聲明 //正確的演示 ITestOne test = new Test(); test.Add(1); test.Add(2); Console.WriteLine(test[0]); //Test類沒有實現自己的索引器。 //如果Test類實現了自己的索引器,才能這樣做。即在Test類中加入public int this[int index]{......} //錯誤的演示 //Test test = new Test(); //test.Add(1); //test.Add(2); //Console.WriteLine(test[0]); }