インターフェイスのデザイン

ほとんどの API はクラスと構造体を使用して最良のモデル化が行われますが、インターフェイスのほうが適している場合や、インターフェイスが唯一のオプションである場合があります。

CLR では複数の継承はサポートされていません (つまり、複数の基底クラスから CLR クラスを継承することはできません) が、1 つの基底クラスからの継承に加えて、型で 1 つまたは複数のインターフェイスを実装できます。 したがって、多くの場合、インターフェイスは、多重継承の効果を実現するために使用されます。 たとえば、IDisposable は、参加する必要のある他の継承階層とは無関係に、型で廃棄性をサポートできるようにするインターフェイスです。

インターフェイスを定義することが適している他の状況としては、いくつかの値型を含む複数の型によってサポートされることが可能な共通インターフェイスを作成することがあります。 値型は ValueType 以外の型から継承することはできませんが、インターフェイスを実装することはできるため、インターフェイスを使用することが共通の基本データ型を提供するための唯一のオプションになります。

✔️ 値型を含む型セットによってサポートされる何らかの共通 API が必要な場合は、インターフェイスを定義してください。

✔️ 他の型から既に継承されている型に対してインターフェイスの機能をサポートする必要がある場合は、インターフェイスを定義することを検討してください。

❌ マーカー インターフェイス (メンバーのないインターフェイス) を使用することは避けてください。

クラスを特定の特性 (マーカー) を持っているとマークする必要がある場合は、通常は、インターフェイスではなくカスタム属性を使用してください。

✔️ インターフェイスの実装である型を少なくとも 1 つ用意してください。

これを行うと、インターフェイスの設計を検証するのに役立ちます。 たとえば、List<T>IList<T> インターフェイスの実装です。

✔️ 定義した各インターフェイスを使用する API (インターフェイスをパラメーターとして使用するメソッドまたはインターフェイスと型指定されたプロパティ) を少なくとも 1 つ用意してください。

これを行うと、インターフェイスの設計を検証するのに役立ちます。 たとえば、List<T>.Sort では System.Collections.Generic.IComparer<T> インターフェイスが使用されます。

❌ 以前に出荷されているインターフェイスにメンバーを追加しないでください。

これを行うと、インターフェイスの実装が中断されます。 バージョンの問題を回避するために、新しいインターフェイスを作成してください。

これらのガイドラインで説明されている状況を除き、一般に、マネージド コードの再利用可能なライブラリの設計では、インターフェイスではなくクラスを選択してください。

Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

2008 年 10 月 22 日に Microsoft Windows Development シリーズの一部として、Addison-Wesley Professional によって発行された、Krzysztof Cwalina および Brad Abrams による「Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition」 (フレームワーク デザイン ガイドライン: 再利用可能な .NET ライブラリの規則、用法、パターン、第 2 版) から Pearson Education, Inc. の許可を得て再印刷されています。

関連項目