3 Stimmen

C#: Explizite Angabe der Schnittstelle in der Methode einer Implementierung

Warum muss ich bei der Implementierung einer Schnittstelle, wenn ich die Methode öffentlich mache, die Schnittstelle nicht explizit angeben, aber wenn ich sie privat mache, muss ich das... wie zum Beispiel ( GetQueryString ist eine Methode aus IBar ):

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

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

Warum müssen Sie also die Schnittstelle explizit angeben, wenn die Methode privat ist, aber nicht, wenn sie öffentlich ist?

11voto

Jon Skeet Punkte 1325502

Die explizite Schnittstellenimplementierung ist eine Art Zwischenstation zwischen öffentlich und privat: Sie ist öffentlich, wenn man eine schnittstellentypische Referenz verwendet, um auf sie zuzugreifen, aber das ist die nur zugreifen können (sogar in derselben Klasse).

Wenn Sie eine implizite Schnittstellenimplementierung verwenden, müssen Sie sie als öffentlich angeben, da sie es eine öffentliche Methode, die Sie aufgrund der Tatsache, dass sie in der Schnittstelle enthalten ist, außer Kraft setzen. Mit anderen Worten, der gültige Code ist:

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

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

Ich persönlich verwende selten eine explizite Schnittstellenimplementierung, es sei denn, sie ist erforderlich für Dinge wie IEnumerable<T> die unterschiedliche Signaturen für GetEnumerator je nachdem, ob es sich um die generische oder nicht-generische Schnittstelle handelt:

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

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

Hier können Sie haben eine explizite Schnittstellenimplementierung zu verwenden, um eine Überladung aufgrund des Rückgabetyps zu vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X