Warum kann die explizite Implementierung einer Schnittstelle nicht öffentlich sein?


75

Ich habe eine Methode in der Klasse, die die Implementierung der Schnittstelle ist. Als ich es explizit implementiert habe, habe ich einen Compilerfehler bekommen

The modifier 'public' is not valid for this item

Warum darf es publicfür die explizite Schnittstellenimplementierung nicht sein?

Antworten:


69

Der Grund für eine explizite Schnittstellenimplementierung besteht darin, Namenskollisionen zu vermeiden. Das Endergebnis ist, dass das Objekt vor dem Aufrufen dieser Methoden explizit in diese Schnittstelle umgewandelt werden muss.

Sie können sich diese Methoden nicht als öffentlich in der Klasse vorstellen, sondern als direkt an die Schnittstelle gebunden. Es gibt keinen Grund, public / private / protected anzugeben, da es immer öffentlich ist, da Schnittstellen keine nicht öffentlichen Mitglieder haben können.

(Microsoft hat einen Überblick über die explizite Schnittstellenimplementierung )


3
Für die implizite Schnittstelle muss auch nicht angegeben werden, dass sie öffentlich ist, dies ist jedoch zulässig, und tatsächlich muss dies der Fall sein. Die Schnittstelle, die öffentliche Logik impliziert, erklärt also nicht wirklich die ursprüngliche Frage, die ich sagen würde.
Liang

Bei impliziten Schnittstellen ist die Methode einfach eine Methode, die privat sein kann. Allein die Signatur macht es zu einer Implementierung der Schnittstellenmethode. Eine explizite Schnittstellendefinition kann nur öffentlich sein. Ich verstehe Ihren Standpunkt, aber TBH, das öffentliche implizite Methoden zulässt, bezieht sich wahrscheinlich nur auf die Reihenfolge, in der der Compiler die Dinge ausführt.
Richard Szalay

3
"...since it will always be public...";; Technisch ist dies nicht korrekt, da Sie die explizit implementierte Funktion erst von außen aufrufen können, wenn Sie das Objekt in die Schnittstelle umwandeln.
Massood Khaari

@Massood - Ihre Auffindbarkeit hat nichts mit ihrer Zugänglichkeit zu tun. Die Mitglieder sind sicherlich öffentlich, da sie von nicht verwandten Klassen und nicht nur von der deklarierenden Klasse (privat), abgeleiteten Klassen (geschützt) oder Versammlung (intern) zugänglich sind
Richard Szalay

10
Es geht um die Definition von "öffentlich". Ich habe die C # -Sprachenspezifikation überprüft . In Abschnitt 13.4.1, Seite 392 heißt es:"Explicit interface member implementations have different accessibility characteristics than other members. Because explicit interface member implementations are never accessible through their fully qualified name in a method invocation or a property access, they are in a sense private. However, since they can be accessed through an interface instance, they are in a sense also public."
Massood Khaari

27

Die explizite Elementimplementierung ermöglicht die Disambiguierung von Schnittstellenmitgliedern mit derselben Signatur.

Ohne explizite Implementierungen von Schnittstellenelementen wäre es für eine Klasse oder Struktur unmöglich, unterschiedliche Implementierungen von Schnittstellenelementen mit derselben Signatur und demselben Rückgabetyp zu haben.

Warum kann die explizite Implementierung einer Schnittstelle nicht öffentlich sein? Wenn ein Mitglied explizit implementiert ist, kann nicht über eine Klasseninstanz, sondern nur über eine Instanz der Schnittstelle darauf zugegriffen werden.

public interface IPrinter
{
   void Print();
}
public interface IScreen
{
   void Print();
}

public class Document : IScreen,IPrinter
{
    void IScreen.Print() { ...}
    void IPrinter.Print() { ...} 
}

.....
Document d=new Document();
IScreen i=d;
IPrinter p=d;
i.Print();
p.Print();
.....

Auf Implementierungen von expliziten Schnittstellenelementen kann nicht über Klassen- oder Strukturinstanzen zugegriffen werden.


9
Die meisten Leute stimmen dir nicht zu? Ich kann das kaum glauben, wenn man bedenkt, dass genau deshalb explizite Schnittstellenimplementierungen existieren. msdn.microsoft.com/en-us/library/ms173157.aspx
Richard Szalay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.