1

MSDN: System.Type

上記のリンクのように、C# の多くの BCL クラスには、明示的なインターフェイスの実装がクラス メンバーとして含まれています。

基本インターフェイスのメンバー間で名前の競合が発生した場合、明示的なインターフェイスの実装を使用する必要があることを理解しています。しかし、なぜ上記のケースで明示的なインターフェイスの実装を使用する必要があるのでしょうか? 名前が競合するインターフェイスはどれですか?

4

1 に答える 1

2

インターフェイスの明示的な実装は、呼び出し元のコードが明示的にインターフェイスを要求しない限り、インスタンスのプロパティ/メソッドを非表示にするために使用されます。

これは、次のシナリオで役立ちます。

  • クラスの作成者は、インターフェイスの実装はまれなケースでのみ使用され、使いやすさのためにデフォルトで非表示にする必要があると考えています (明示的なインターフェイスの実装は COM 固有であるため、これは明らかにTypeクラスの場合です)。
  • クラスは、共通のメソッド/プロパティ シグネチャを持つ 2 つ以上のインターフェイスを実装しますが、インターフェイスに応じて異なる実装を提供する必要があります。これは、インターフェイスがメソッド シグネチャを超えて暗黙的でありながら異なる動作の契約を持っているためです ( Typeクラスにもこの例があります。おそらく、_MemberInfo.GetIDsOfNames と _Type.GetIDsOfNames の実装は同じ署名を共有しますが、 Typeインスタンスを _MemberInfo インターフェイスにキャストするか、_Type インターフェイスにキャストするかによって異なることを行います)。
  • これは (推奨されませんが) クラスに IDisposable を実装させて、そのインスタンスをusingブロックで使用できるようにするために使用されていますが、メソッドを呼び出すときにクラスを "破棄" するためのよりドメイン固有のメソッドを呼び出し元が使用することを奨励しています。直接。http://blogs.msdn.com/b/kimhamil/archive/2008/03/15/the-often-non-difference-between-close-and-dispose.aspxを参照してください。
  • API 開発者が、アセンブリ内でのみ実装を使用する必要があるインターフェイスを実装するために公開しているパブリック クラスが必要な場合に使用できます。この場合、インターフェイスはinternalキーワードで宣言され、公開クラスはインターフェイスを明示的に実装します。最終的に、アセンブリ内のコードのみがクラスのインスタンスを内部インターフェイスにキャストしてその実装にアクセスできますが、アセンブリ外の呼び出し元はアクセスできません。

これらは頭に浮かぶユースケースです。私がリストしていない他のものがあると確信しています。

于 2012-07-11T00:34:49.607 に答える