讀書筆記 C# 接口中的索引器之淺析


在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]);

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM