更新 : 2007 年 11 月
インターフェイスとは、何らかの機能をサポートするためのコントラクトです。インターフェイスを実装するクラスでは、インターフェイスで指定したメンバの実装に関する詳細を提供する必要があります。たとえば、IEnumerator インターフェイスでは、コレクションなど、一連のオブジェクトの列挙処理をサポートするために実装する必要のあるメンバ シグネチャを定義します。IEnumerator を実装するためには、クラスが Current メンバ、MoveNext メンバ、および Reset メンバを実装している必要があります。
インターフェイス メンバをクラスで明示的に実装したら、インターフェイスへの参照を使用するだけでメンバにアクセスできます。これには、インターフェイス メンバを隠ぺいする効果があります。インターフェイス メンバを明示的に実装する一般的な理由には、インターフェイスのコントラクトに準拠するということだけでなく、何らかの方法 (厳密に型指定されていないメソッドの代わりとして使用する必要がある厳密に型指定されたメソッドを提供するなど) でインターフェイスの機能を向上させるということも含まれます。明示的なインターフェイス メンバが開発者によって呼び出されないようにする必要がある場合にも、インターフェイス メンバを明示的に実装します。たとえば、GetObjectData は最もよく明示的に実装されるメンバです。それは、このメンバがコードからの呼び出しを想定したものではなく、シリアル化インフラストラクチャによって呼び出されるメンバだからです。
次のデザイン ガイドラインは、ライブラリ デザインにおいて、どのような場合に明示的なインターフェイスの実装を使用するかを確認するうえで役立ちます。
積極的な理由がない場合は、インターフェイス メンバの明示的な実装を避けます。
明示的な実装について理解するには、高度な専門知識が必要です。たとえば、明示的に実装したメンバはそのシグネチャがプライベートであってもパブリックに呼び出すことができることを知らない開発者が大勢います。シグネチャがプライベートであるため、明示的に実装されたメンバは、パブリックに参照できるメンバのリストには表示されません。また、メンバを明示的に実装すると、不必要に値型がボックス化される原因となることもあります。
インターフェイスを介してのみメンバを呼び出す場合は、インターフェイス メンバの明示的実装を検討します。
これには主に、データ バインディングやシリアル化など、.NET Framework のインフラストラクチャをサポートするメンバが含まれます。たとえば、IsReadOnly プロパティは、ICollection<T> インターフェイスへの参照を使用してデータ バインディング インフラストラクチャからのみアクセスすることを意図したものです。このガイドラインに合致しているため、List<T> クラスでは、このプロパティを明示的に実装します。
分散をシミュレートする (つまり、オーバーライドされたメンバのパラメータや戻り値の型を変更する) 場合は、インターフェイス メンバの明示的な実装を検討します。
これは、インターフェイス メンバの厳密に型指定されたバージョンを提供する場合によく行われます。
メンバを隠ぺいし、より適切な名前を持つ等価なメンバを追加する場合は、インターフェイス メンバの明示的な実装を検討します。
これによりメンバの名前が事実上変更されます。たとえば、Stream は Dispose を明示的に実装し、代わりに Close メソッドを提供します。
明示的なメンバをセキュリティの境界として使用しないでください。
明示的にメンバを実装した場合、セキュリティは一切提供されません。これらのメンバは、インターフェイスへの参照を使用してパブリックに呼び出すことができるようになります。
機能を派生クラスによって専門的に処理する場合は、明示的に実装されたメンバと同じ機能を提供するプロテクト仮想メンバ関数を用意します。
明示的に実装されたメンバはオーバーライドできません。これらを派生クラスで再定義した場合、派生クラスでは基本クラス実装を呼び出すことができなくなります。プロテクト メンバに名前を付けるには、明示的なインターフェイス メンバと同じ名前を使用するか、またはインターフェイス メンバの名前に Core を付け加える必要があります。
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』を参照してください。