4

インターフェイスを実装するには、次の2つの方法があります。

interface IMyInterface
{
    void Foo();
}

class IImplementAnInterface : IMyInterface
{
    public void Foo()
    {
    }
}
// var foo = new IImplementAnInterface();
// foo.Foo(); //Ok
// ((IMyInterface)foo).Foo(); //Ok

class IExplicitlyImplementAnInterface : IMyInterface
{
    void IMyInterface.Foo()
    {
    }
}
// var foo = new IExplicitlyImplementAnInterface();
// foo.Foo(); //ERROR!
// ((IMyInterface)foo).Foo(); //Ok

違いは、インターフェイスが明示的に実装されている場合、誰かがFooメソッドを呼び出すことを許可される前に、実際に指定されたインターフェイスとしてキャストする必要があることです。

どちらを使用するかをどのように決定しますか?

4

4 に答える 4

5

衝突があり(2つのインターフェイスに同じシグネチャのメソッドがある場合、またはクラス/基本クラスとインターフェイスが同じ方法で衝突する)、衝突するメソッドに同じボディを持たせたくない場合は、次を使用する必要があります。明示的なインターフェイス。

それ以外の場合は、自由に選択できます。実装されたメソッドの一部を非表示にする場合は、明示的なメソッドを選択します。たとえば、Dictionary <、>クラスは、ICollection <>インターフェイスのいくつかのメソッドを使用してこれを実行します。これは、非表示のメソッドが人々を混乱させるためです。

于 2010-12-29T18:37:03.467 に答える
2

たとえば、IEnumerableとIEnumerable <>を実装するときに、両方のインターフェイスがメソッドを公開する場合など、明示的な実装を提供する必要がある場合がありますGetEnumerator

私が従う一般的なルールの1つは、インターフェイスを実装するが、インターフェイス機能を公開するためのより便利でタイプセーフなメソッドとプロパティを追加で提供する場合、インターフェイスを明示的に実装することです。これにより、クラスが公開するパブリックインターフェイスがより適切になり、実装されたインターフェイスに依存する可能性のあるアルゴリズムが、インターフェイスで提供されるメソッドとプロパティにアクセスできるようになります。

それは言葉では言い表せませんでしたが、それが理にかなっていることを願っています。

于 2010-12-29T18:38:10.377 に答える
1

複数のインターフェースが実装されていて、両方に同じ名前のメソッドが含まれている場合にのみ、これをお勧めします。

メソッドを明示的に実装して、それを効果的に「非表示」にし、より適切な名前で同等のメソッドを実装することもできます。System.IO.Streamはこれを行い、Disposeを明示的に実装し、より適切な名前のClose()を提供します。

詳細については、このMSDNの記事を参照してください:http://msdn.microsoft.com/en-us/library/ms229034.aspx

于 2010-12-29T18:45:43.063 に答える
0

これは、「リターン型共分散」を禁止する.NETの回避策として最も一般的に見られます。

于 2010-12-29T19:02:05.063 に答える