次の方法で共有


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

更新 : 2007 年 11 月

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

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

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

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

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

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

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

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

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

Portions Copyright 2005 Microsoft Corporation.All rights reserved.

Portions Copyright Addison-Wesley Corporation.All rights reserved.

デザイン ガイドラインの詳細については、2005 年に Addison-Wesley から出版されている Krzysztof Cwalina、Brad Abrams 共著の『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries』を参照してください。

参照

概念

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

その他の技術情報

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

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