クラスまたはインターフェイスの選択

インターフェイスでは、実装側が提供する必要があるメンバーのセットのシグネチャを定義します。 インターフェイスでは、メンバーの実装の詳細を提供できません。 たとえば、ICollection インターフェイスは、コレクションの操作に関連するメンバーを定義します。 インターフェイスを実装するすべてのクラスは、これらのメンバーの実装の詳細を提供する必要があります。 クラスは、複数のインターフェイスを実装できます。

クラスは、メンバーのシグネチャと実装の詳細の両方をメンバーごとに定義します。 Abstract (Visual Basic の場合は MustInherit) クラスは、メンバーを定義でき、さらに必要に応じて実装の詳細を提供できるという点で、インターフェイスや通常のクラスと同様の機能を果たします。 抽象クラスで実装の詳細を提供しない場合は、抽象クラスを継承する具象クラスで実装を提供する必要があります。

抽象クラスもインターフェイスも実装からのコントラクトの分離をサポートします。ただし、インターフェイスはその後のバージョンで新しいメンバーを指定できませんが、抽象クラスは、追加機能をサポートするために必要に応じてメンバーを追加できます。

インターフェイスよりもクラスを定義するようにしてください。

ライブラリのその後のバージョンで、クラスには新しいメンバーを安全に追加できます。インターフェイスにメンバーを追加すると、既存のコードが破損します。

コントラクトを実装から分離するには、インターフェイスではなく、抽象クラス (Visual Basic の場合は MustInherit クラス) を使用してください。

値型のポリモーフィックな階層構造を提供する必要がある場合は、インターフェイスを定義してください。

値型は ValueType を継承する必要があり、また ValueType しか継承できないため、クラスを使用してコントラクトと実装を分離できません。 この場合、値型でポリモーフィックな動作が必要なときは、インターフェイスを使用する必要があります。

多重継承と同様の効果を実現する場合は、インターフェイスを定義するようにしてください。

型で複数のコントラクトを実装する必要がある場合やコントラクトを多彩な型に適用する場合は、インターフェイスを使用します。 たとえば、IDisposable は、さまざまなシナリオで使用される型によって実装されます。 基本クラスを継承するクラスを破棄可能にすると、クラスの階層構造が過度に硬直化します。 MemoryStream などのクラスは、その親クラスからストリーム ベースのコントラクトを継承する必要がありますが、この継承と破棄可能を同時に実現するのは不可能です。

Portions Copyright 2005 Microsoft Corporation. All rights reserved.

Portions Copyright Addison-Wesley Corporation. All rights reserved.

設計ガイドラインの詳細についてを参照してください、「フレームワークの設計ガイドライン。規則、慣用句、および再利用可能なパターン。ネット ライブラリ」本クシシュトフ Cwalina、ブラッド エイブラムス、アスキー、2005 年発表しました。

参照

概念

クラスまたは構造体の選択

その他の技術情報

型のデザインのガイドライン

クラス ライブラリ開発のデザイン ガイドライン