インターフェイス メンバーの明示的な実装
インターフェイスとは、何らかの機能をサポートするためのコントラクトです。 インターフェイスを実装するクラスでは、インターフェイスで指定したメンバーの実装に関する詳細を提供する必要があります。 たとえば、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.
設計ガイドラインの詳細についてを参照してください、「フレームワークの設計ガイドライン。規則、慣用句、および再利用可能なパターン。ネット ライブラリ」本クシシュトフ Cwalina、ブラッド エイブラムス、アスキー、2005 年発表しました。