介面設計
注意
此內容是由 Pearson Education, Inc. 授權轉載自架構設計指導方針:可重複使用 .NET 程式庫的慣例、慣用語和模式,第 2 版。 該版於 2008 年出版,該書自那以後已於第三版進行了全面修訂。 此頁面上的某些資訊可能已過期。
雖然大部分的 API 都是最適合使用類別和結構來建立模型,但在某些情況下,介面更適合或是唯一的選項。
CLR 不支援多個繼承 (亦即 CLR 類別無法繼承自多個基底類別),但除了繼承自基底類別之外,還允許型別實作一或多個介面。 因此,介面通常用於達成多重繼承的效果。 例如,IDisposable 是一個介面,可讓型別支援與想要參與的任何其他繼承階層無關的可處置性。
定義介面很合適的另一種情況是建立可由數種型別支援的通用介面,包括某些實值型別。 實值型別無法繼承自 ValueType 以外的型別,但可以實作介面,因此使用介面是唯一的選項,才能提供通用基底型別。
✔️ 如果您需要一組包含實值型別的型別支援一些通用 API,請定義介面。
✔️ 如果您需要在已經繼承自某些其他型別的型別上支援其功能,請考慮定義介面。
❌ 請避免使用標記介面 (沒有成員的介面)。
如果您需要將類別標示為具有特定特性 (標記),一般而言,請使用自訂屬性,而不是介面。
✔️ 提供至少一種型別,這是介面的實作。
這樣做有助於驗證介面的設計。 例如,List<T> 是 IList<T> 介面的實作。
✔️ 提供至少一個 API,以取用您定義的每個介面 (將介面當作參數的方法或是型別化為介面的屬性)。
這樣做有助於驗證介面設計。 例如,List<T>.Sort 會取用 System.Collections.Generic.IComparer<T> 介面。
❌ 請勿將成員新增至先前隨附的介面。
這樣做會中斷介面的實作。 您應該建立新的介面,以避免版本設定問題。
除了這些指導方針中所述的情況之外,一般而言,在設計受控程式碼可重複使用程式庫時,您應該選擇類別而不是介面。
Portions © 2005, 2009 Microsoft Corporation. 著作權所有,並保留一切權利。
獲 Pearson Education, Inc. 的授權再版,從 Krzysztof Cwalina 和 Brad Abrams 撰寫,並在 2008 年 10 月 22 日由 Addison-Wesley Professional 出版,作為 Microsoft Windows Development Series 一部份的 Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 節錄。