例如,使用接口能夠在類中包括來自多個源的行爲。 因爲C#語言不支持多重繼承,因此該功能很重要。 此外,若是要模擬結構的繼承,也必須使用接口,由於它們沒法實際從另外一個結構或類繼承。ide
可以使用 interface 關鍵字定義接口,如如下示例所示。函數
interface IEquatable<T> { bool Equals(T obj); }
實現 IEquatable<T> 接口的任何類或結構都必須包含與該接口指定的簽名匹配的 Equals 方法的定義。 所以,能夠依靠實現 IEquatable<T> 的類來包含 Equals 方法,類的實例能夠經過該方法肯定它是否等於相同類的另外一個實例。ui
IEquatable<T> 的定義不爲 Equals 提供實現。 該接口僅定義簽名。 這樣,C# 中的接口便相似於其中全部方法都是抽象方法的抽象類。 可是,類或結構能夠實現多個接口,可是類只能繼承單個類(抽象或不抽象)。 所以,使用接口能夠在類中包括來自多個源的行爲。this
有關抽象類的詳細信息,請參閱抽象類、密封類及類成員。spa
接口能夠包含方法、屬性、事件、索引器或這四種成員類型的任意組合。 有關示例的連接,請參閱相關章節。 接口不能包含常量、字段、運算符、實例構造函數、析構函數或類型。 接口成員會自動成爲公共成員,不能包含任何訪問修飾符。 成員也不能是靜態成員。3d
若要實現接口成員,實現類的對應成員必須是公共、非靜態,而且具備與接口成員相同的名稱和簽名。code
當類或結構實現接口時,類或結構必須爲該接口定義的全部成員提供實現。 接口自己不提供類或結構能夠經過繼承基類功能的方式來繼承的任何功能。 可是,若是基類實現接口,則從基類派生的任何類都會繼承該實現。orm
下面的示例演示 IEquatable<T> 接口的實現。 實現類 Car 必須提供 Equals 方法的實現。xml
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 訪問器的屬性。 實現該接口的類能夠聲明同時具備 get 和 set 訪問器的相同屬性。 可是,若是屬性或索引器使用顯式實現,則訪問器必須匹配。 有關顯式實現的詳細信息,請參閱顯式接口實現(C# 編程指南)和接口屬性(C# 編程指南)。
接口能夠實現其餘接口。 類可能經過它繼承的基類或經過其餘接口實現的接口來屢次包含某個接口。 可是,類只能提供接口的實現一次,而且僅當類將接口做爲類定義的一部分 (class ClassName : InterfaceName) 進行聲明時才能提供。若是因爲繼承實現接口的基類而繼承了接口,則基類會提供接口的成員的實現。 可是,派生類能夠從新實現接口成員,而不是使用繼承的實現。
基類還可使用虛擬成員實現接口成員。 在這種狀況下,派生類能夠經過重寫虛擬成員來更改接口行爲。 有關虛擬成員的詳細信息,請參閱多態性。