3

インターフェイスを実装するときに、メソッドをパブリックにする場合はインターフェイスを明示的に指定する必要はありませんが、プライベートにする場合は...そのようにする必要があります(GetQueryStringIBarのメソッドです)。

public class Foo : IBar
{
    //This doesn't compile
    string GetQueryString() 
    {
        ///...
    }

    //But this does:
    string IBar.GetQueryString() 
    {
        ///...
    }
}

では、メソッドがプライベートになっているときにインターフェイスを明示的に指定する必要があるのに、メソッドがパブリックになっているときは指定しないのはなぜですか?

4

1 に答える 1

11

明示的なインターフェイスの実装は、パブリックとプライベートの中間のようなものです。インターフェイスタイプの参照を使用して取得する場合はパブリックですが、これが(同じクラスであっても)アクセスする唯一の方法です。

暗黙的なインターフェース実装を使用している場合は、それをパブリックとして指定する必要があります。これは、インターフェース内にあるためにオーバーライドするパブリックメソッドであるためです。つまり、有効なコードは次のとおりです。

public class Foo : IBar
{
    // Implicit implementation
    public string GetQueryString() 
    {
        ///...
    }

    // Explicit implementation - no access modifier is allowed
    string IBar.GetQueryString() 
    {
        ///...
    }
}

個人的には、ジェネリックインターフェイスか非ジェネリックインターフェイスかに基づいIEnumerable<T>て異なるシグネチャを持つものなどに必要な場合を除いて、明示的なインターフェイス実装を使用することはめったにありません。GetEnumerator

public class Foo : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        ...
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator(); // Call to the generic version
    }
}

ここでは、リターンタイプに基づいてオーバーロードを試みないように、明示的なインターフェイス実装を使用する必要があります。

于 2009-06-17T09:59:22.643 に答える