介面 (C# 程式設計手冊)

更新:2007 年 11 月

介面是使用 interface 關鍵字定義的,如下列範例所示:

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

介面會描述屬於任何類別結構的相關功能群組。介面可以由方法、屬性、事件、索引子或這四種成員型別的任意組合而組成。介面不可以包含欄位。介面成員會自動變成公用的。

當類別或結構繼承介面時,這表示類別或結構會提供介面所定義之所有成員的實作 (Implementation)。與可以繼承的基底類別 (Base Class) 功能相較,介面本身無法提供讓類別或結構繼承的功能。不過,如果基底類別實作了介面,衍生類別 (Derived Class) 就會繼承該實作。

類別和結構 (Struct) 可以繼承自介面,就像類別可以繼承基底類別 (Base Class) 或結構一樣,但是有兩個例外:

  • 類別或結構都可繼承多個介面。

  • 當類別或結構繼承某個介面時,只會繼承方法名稱和簽章 (Signature),因為介面本身不含任何實作 (Implementation)。例如:

    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;
        }
    }
    

若要實作介面成員,對應的類別成員必須是公用、非靜態,而且具有與介面成員相同的名稱和簽章。類別上的屬性和索引子 (Indexer),可以為介面中所定義之屬性或索引子定義額外的存取子。例如,介面可以使用 get 存取子定義屬性,但是實作介面的類別可以同時使用 get 和 set 存取子宣告相同的屬性。不過,如屬性或索引子使用明確實作,則存取子必須相符。

介面和介面成員是抽象的,介面並未提供預設實作。如需詳細資訊,請參閱抽象和密封類別以及類別成員

IEquatable<T> 介面會向物件使用者表示,此物件可以判斷它是否與同型別的其他物件相等,而介面使用者並不需要知道實作的方式為何。

介面可以繼承其他介面。透過繼承的基底類別或介面,類別可以繼承介面多次。在這種情況下,如果將介面宣告為新類別的一部分,就只能實作介面一次。如果繼承的介面不是宣告為新類別的一部分,則會由負責宣告的基底類別提供實作。基底類別可以使用虛擬成員實作介面成員,在這種情況下,繼承介面的類別可以透過覆寫虛擬成員變更介面行為。如需虛擬成員的詳細資訊,請參閱多型 (C# 程式設計手冊)

介面概觀

介面有下列屬性:

  • 介面類似於抽象基底類別,繼承介面的任何非抽象型別都必須實作所有成員。

  • 介面無法直接執行個體化。

  • 介面可以包含事件、索引子、方法和屬性。

  • 介面不包含方法實作。

  • 類別或結構都可以繼承自一個以上的介面。

  • 介面本身可繼承自多個介面。

本章節內容

相關章節

請參閱

概念

C# 程式設計手冊

參考

繼承 (C# 程式設計手冊)