2009-06-17 4 views
3

Warum ist es so, dass ich bei der Implementierung einer Schnittstelle, wenn ich die Methode public mache, die Schnittstelle nicht explizit angeben muss, aber wenn ich sie privat mache, muss ich ... wie solche (GetQueryString ist eine Methode aus IBar):C#: explizite Angabe der Schnittstelle in einer Implementierungsmethode

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

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

Also warum müssen Sie die Schnittstelle explizit angeben, wenn die Methode privat gemacht wird, aber nicht, wenn die Methode ist öffentlich?

+0

Wenn du sagst, dass es nicht funktioniert, meinst du - kompiliert nicht oder läuft nicht wie erwartet? –

+0

kompiliert nicht –

Antwort

11

Explizite Schnittstellenimplementierung ist eine Art Halbwegs zwischen öffentlich und privat: es ist öffentlich, wenn Sie eine Schnittstelle-typisierte Referenz verwenden, um darauf zu kommen, aber das ist die nur Art und Weise des Zugriffs (auch in die selbe Klasse).

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

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

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

persönlich selten ich explizite Schnittstellenimplementierung verwenden, wenn es für Dinge wie IEnumerable<T> erforderlich ist, die auf unterschiedliche Signaturen für GetEnumerator haben basierend, ob es die generische oder nicht-generische Schnittstelle:

Hier haben Sie haben explizite Schnittstellenimplementierung zu verwenden, um zu versuchen, basierend auf Rückgabetyp zu überlasten.

+0

Jon, ich habe Änderungen an meinem Code in der Post gemacht, weil ich einen Fehler früher in der Zuordnung genau meinen Code gemacht habe. –

+1

Okay, Bearbeitung. Der Kern der Antwort ist jedoch der gleiche. –

+0

Danke für die Bearbeitung und die Antwort. –