web-dev-qa-db-ja.com

暗黙的インターフェイスと明示的インターフェイスの実装

可能性のある複製:
C#:インターフェイス-暗黙的および明示的な実装

誰かがこれらの2つの獣の違いとそれらの使用方法を説明しますか?私の知る限り、多くのpre.2.0クラスはジェネリック型なしで実装されていたため、後者のバージョンでは両方の種類のインターフェースを実装していました。それらを使用する必要があるのはなぜですか?

また、それらの使用方法を詳細に説明できますか?

ありがとう

73
Sasha

これについては非常に詳細なブログ記事があります。

基本的に、暗黙的なインターフェイスの実装では、インターフェイスメソッドとプロパティにクラスの一部であるかのようにアクセスします。明示的なインターフェイス実装では、そのインターフェイスとして扱う場合にのみアクセスできます。

どちらを使用するかという点では、インターフェイスと同じシグネチャを持つプロパティ/メソッドがあるか、同じシグネチャを持つ2つのインターフェイスを実装し、一致するプロパティ/メソッド。

以下のルールは、ブラッドエイブラムスによるものです デザインガイドラインブログ

  • セキュリティ境界として明示的なメンバーを使用しないインスタンスをインターフェイスにキャストするクライアントはこれらを呼び出すことができます。
  • Do明示的なメンバーを使用して実装の詳細を非表示にします
  • Doは、明示的なメンバーを使用して、プライベートインターフェイスの実装を近似します。
  • Doは、サブクラスがオーバーライドできる明示的に実装されたメンバーにアクセスする代替方法を公開します。競合が発生しない限り、同じメソッド名を使用してください。

また、Bradのブログのコメントで、値の型で明示的な実装を使用する場合はボックス化が関係しているため、パフォーマンスコストに注意してください。

115
Andrew Barrett

素人の言葉で言えば、クラスが2つ以上のインターフェイスを継承し、インターフェイスが同じメソッド名を持っている場合、暗黙的なインターフェイス実装を使用すると、クラスはどのインターフェイスメソッドが実装されているかを知りません。これは、インターフェイスを明示的に実装するシナリオの1つです。

暗黙的なインターフェイスの実装

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

明示的なインターフェースの実装

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }

    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

次のリンクには、この概念を説明する優れたビデオがあります
明示的なインターフェイスの実装

22
Suresh

迷宮の実装自体から、それを見るもう1つの方法があります: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx

しかし、要するに、暗黙の実装はis-a型変換を提供し、オブジェクトがそのインターフェイス型に明示的に型キャストされない限り、明示的な実装はアクセスできません。

4
Tanveer Badar