2013年12月18日 星期三

C# - Interface 設計模式的靈魂

玩過物件導向,一定少不了Interface這樣的關鍵字,對於熟悉Design Pattern的開發者而言,Interface就像是寶劍一樣,想要對Design Pattern玩到爐火純青,就一定要對它有深入的了解,筆者就來說說這個不可一世的關鍵字。
在C#中Interface是包含類別或結構可實作相關功能的定義。
使用介面時,在類別中包括來自於多重來源的行為。 因為語言不支援類別,多重繼承該功能是重要的屬性。 要模擬結構的繼承,必須使用介面,因為無法從其他結構實際上繼承或類別。

下方是使用interface關鍵字定義一個接口的範例:

interface IEquatable<T>
{
    bool Equals(T obj);

}

依照上面的程式而言,任何類別或實作 IEquatable<T> 介面的結構必須包含符合簽章指定介面的 Equals 方法的定義。 所以在實作 IEquatable<T> 方法包含 Equals 類別的執行個體可以判斷的類別可以計算它是否與另一個相同類別的執行個體是否相等。
IEquatable<T> 的定義為 Equals不會提供的實作。 介面會定義只有簽章。 以這種方式,介面在 C# 類似於所有方法是抽象的抽象類別。 類別或結構可以實作多個介面,而且類別可以繼承只有單一類別,摘要。 因此可以使用介面並有多個來源的行為。
介面可包含方法、屬性、事件、索引子,或者這些四個成員型別的任何組合。 介面不能包含常數、欄位、運算子、執行個體建構函式、解構函式或型別。 Interface成員會自動是公用的,因此,Interface不能包含任何存取修飾詞。 成員不能是static。
若要實作介面成員,實作的類別中對應的成員必須是public,不是static,而且具有相同名稱和簽章與介面成員。
當類別或結構實作介面時,類別或結構必須為所有成員提供實作介面來定義。 介面不提供類別或結構可繼承,如果基底類別實作介面,從基底類別衍生的任何類別繼承該實作。
下列範例顯示 IEquatable<T> 介面的實作。 實作的類別,則為 Car,必須提供 Equals 方法的實作。

public class Car : IEquatable<Car>
{
    public string Make { get; set; }
    public string Model { get; set; }
    public string Year { get; set; }

    // Implementation of IEquatable<T> interface
    public bool Equals(Car car)
    {
        if (this.Make == car.Make &&
            this.Model == car.Model &&
            this.Year == car.Year)
        {
            return true;
        }
        else
            return false;
    }

}

類別的屬性和索引子可能定義在介面中定義的屬性或索引子的額外的存取子。 實作介面的類別可以宣告 get 和 集合 存取子中的相同屬性。 不過,如屬性或索引子使用明確實作,則存取子必須相符。以下是微軟列出Interface的屬性:

  • 介面是像抽象基底類別。 任何類別或實作介面的結構都必須實作它所有的成員。
  • 介面無法直接執行個體化。 它的成員會由任何實作介面的類別或結構實作。
  • 介面可以包含事件、索引子、方法和屬性。
  • 介面不包含方法實作。
  • 類別或結構可以實作多個介面。 類別可以繼承基底類別也實作一個或多個介面。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言