1. 程式人生 > >C#接口和泛型類

C#接口和泛型類

lse 協議 同步方法 虛方法 bsp 性能問題 容器 rip 容量

1.定義:

定義為一個約束,實現接口的類或者結構必須遵守該約定。借口是類之間交互的一個協議。定義了類之間的交互標準。

接口是類之間相互交互的一個抽象,把類之間需要交互的內容抽象出來定義成接口。

接口只包含成員定義,不包含成員的實現。接口不會繼承自任何的 System.Object 派生類型。接口僅僅是一個包含著一組虛方法的抽象類型

成員的實現需要在繼承的類或者結構中實現接口的成員包括靜

態方法、索引器、常數、事件以及靜態構造器。不能實例化一個接口

.NET 框架中的接口

(1) IComparable 接口

IComparable 接口定義通用的比較方法。由類型使用的 IComparable 接口提供了一種比較多個對象的標準方式。如果一個類要實現與其它對象的比較,則必須實現 IComparable 接口

(2) IEnumerable 接口

IEnumerable 接口公開枚舉數,該枚舉數支持在集合上進行簡單叠代。
IEnumerable 接口可由支持叠代內容對象的類實現

(3) IEnumerator 接口

IEnumerator 接口支持在集合上進行簡單叠代。是所有枚舉數的基接口。
枚舉數只允許讀取集合中的數據,枚舉數無法用於修改基礎集合。

(4) ICollection 接口

ICollection 接口定義所有集合的大小、枚舉數和同步方法。ICollection
接口是 System.Collections 命名空間中類的基接口。

(5) IDictionary 接口
IDictionary 接口是基於 ICollection 接口的更專用的接口。IDictionary 實現

是鍵/值對的集合,如 Hashtable 類。

(6) IList 接口

IList接口實現是可被排序且可按照索引訪問其成員的值的集合,如ArrayList

泛 型 的接 口 , 如 IComparable<T> 、

IEnumerable<T> 、 IEnumerator<T> 、 ICollection<T> 、 IDictionary<T> 和
IList<T>等。泛型接口的功能與非泛型接口的功能一樣,只不過適用於更多的類

System.Collections 名稱空間中的“內置”集合劃分成了三種類別:

(1) 有序集合:僅僅實現 ICollection 接口的集合,在通常情況下,其數據項的
插入順序控制著從集合中取出對象的順序。System.Collections.Stack 和
System.Collections.Queue 類都是 ICollection 集合的典型例子

(2) 索引集合:實現 Ilist 的集合,其內容能經由從零開始的數字檢索取出,就
象數組一樣。System.Collections.ArrayList 類是索引集合的一個例子

(3) 鍵式集合:實現 IDictionary 接口的集合,其中包含了能被某些類型的鍵值
檢索的項。IDictionary 集合的內容通常按鍵值方式存儲,可以用枚舉的方式排
序檢索。

2、接口與抽象類

抽象類(Abstract Class)和接口在定義與功能上有很多相似的地方,在程序
中選擇使用抽象類還是接口需要比較抽象類和接口之間的具體差別

抽象類是一種不能實例化而必須從中繼承的類,抽象類可以提供實現,也可
以不提供實現。子類只能從一個抽象類繼承。抽象類應主要用於關系密切的對象。
如果要設計大的功能單元或創建組件的多個版本,則使用抽象類。
接口是完全抽象的成員集合,不提供實現。類或者結構可以繼承多個接口。
接口最適合為不相關的類提供通用功能。如果要設計小而簡練的功能塊,則使用
接口

 public interface IBook
    {
        void ShowBook();
        string GetTitle();
        int GetPages();
        void SetPages(int pages);
    }

  

public class NewBook:IBook
    {
        public string title;
        public int pages;
        public string author;
        public NewBook(string title, string author, int pages)
        {
            this.title = title;
            this.author = author;
            this.pages = pages;
        }
        
        public void ShowBook()
        {
            Console.WriteLine("Title:{0}", title);
            Console.WriteLine("Author:{0}", author);
            Console.WriteLine("Pages:{0}", pages);
        }

        public string GetTitle()
        {
            return title;
        }

        public int GetPages()
        {
            return pages;
        }

        public void SetPages(int pages)
        {
            this.pages = pages;
        }
    }

  

 static void Main(string[] args)
        {
            NewBook newBook = new NewBook("C#編程", "laoshi", 500);
            newBook.ShowBook();
            Console.ReadKey();
        }

  基於 object 的容器的 C#實現如下:

 public class Container
    {
        readonly int m_Size; //容器的容量
        int m_ContainerPointer; //容器指針,指示最後一個元素的位置
        object[] m_Items; //容器數組,存放數據
        //無參構造器
        public Container() : this(100)
        {
            m_ContainerPointer = -1;
            m_Size = 100;
        }
        //有參構造器
        public Container(int size)
        {
            m_Size = size;
            m_Items = new object[m_Size];
            m_ContainerPointer = -1;
        }

        //獲取容器元素個數屬性
        public int Count
        {
            get {
                return m_ContainerPointer;
            }
        }
        //容器是否為空
        public bool IsEmpty
        {
            get {
                return (m_ContainerPointer == -1);
            }
        }
        //容器是否已滿
        public bool IsFull
        {
            get {
                return (m_ContainerPointer == m_Size - 1);
            }
        }
        //在容器的尾部插入一個元素
        public void Insert(object item)
        {
            if (IsFull)
            {
                Console.WriteLine("Container is full");
                return;
            }
            else if (IsEmpty)
            {
                m_Items[++m_ContainerPointer] = item;
            }
            else {
                m_Items[++m_ContainerPointer] = item;
            }
        }
        //從容器的尾部刪除一個元素
        public object Delete()
        {
            if (m_ContainerPointer >= 0)
            {
                return m_Items[m_ContainerPointer--];
            }
            return null;
        }
    }

  1.存在性能問題 2.類型安全 3.工作效率

2、泛型的概念
通過泛型可以定義類型安全的並且對性能或工作效率無損害的類

public class Container<T>
    {
        readonly int m_Size; //容器的容量
        int m_ContainerPointer; //容器指針,指示最後一個元素的位置
        T[] m_Items; //容器數組,存放數據
        //構造器
         public Container() : this(100)
        {
            m_ContainerPointer = -1;
            m_Size = 100;
        }
        //構造器
        public Container(int size)
        {
            m_Size = size;
            m_Items = new T[m_Size];
            m_ContainerPointer = -1;
        }
        //獲取容器元素個數屬性
        public int Count
        {
            get {
                return m_ContainerPointer;
            }
        }
        //容器是否為空
        public bool IsEmpty
        {
            get {
                return (m_ContainerPointer == -1);
            }
        }
        //容器是否已滿
        public bool IsFull
        {
            get {
                return (m_ContainerPointer == m_Size - 1);
            }
        }
        //在容器的尾部插入一個元素
        public void Inset(T item)
        {
            if (IsFull)
            {
                Console.WriteLine("Container is full!");
                return;
            }
            else if (IsEmpty)
            {
                m_Items[++m_ContainerPointer] = item;
            }
            else {
                m_Items[++m_ContainerPointer] = item;
            }
        }
        //從容器的尾部刪除一個元素
        public object Delete()
        {
            if (m_ContainerPointer >= 0)
            {
                return m_Items[m_ContainerPointer--];
            }
            return null;
        }

    }

  

C#接口和泛型類