Unterschied zwischen impliziter und expliziter Implementierung von C # -Schnittstellen [duplizieren]

8

Was ist der Unterschied zwischen Implementieren Sie die Schnittstelle explizit und Implementieren Sie die Schnittstelle .

Wenn Sie eine Klasse von einer Schnittstelle ableiten, schlägt Ihnen intellisense vor, beides zu tun.

Aber, was ist der Unterschied?

    
eKek0 03.04.2009, 05:34
quelle

8 Antworten

13

Ein anderer Aspekt davon:

Wenn Sie implizit implementiert haben, bedeutet dies, dass die Mitglieder der Benutzeroberfläche für Benutzer Ihrer Klasse zugänglich sind, ohne dass diese umgewandelt werden müssen.

Wenn explizit implementiert ist, müssen die Clients die Klasse in die Schnittstelle umwandeln, bevor sie auf die Mitglieder zugreifen können. Hier ist ein Beispiel für eine explizite Implementierung:

%Vor%

Ihr Kundencode

%Vor%     
Andrew Shepherd 03.04.2009, 05:47
quelle
10

Die IDE gibt Ihnen die Option , um beides zu tun - es wäre ungewöhnlich, beides zu tun. Bei expliziter Implementierung befinden sich die Mitglieder nicht auf der (primären) öffentlichen API; Dies ist praktisch, wenn die Schnittstelle nicht direkt an die Absicht des Objekts gebunden ist. Zum Beispiel sind die ICustomTypeDescriptor -Mitglieder für reguläre Anrufer nicht sehr hilfreich - nur für einen sehr spezifischen Code, so dass es keinen Sinn hat, sie auf der öffentlichen API zu haben, was Chaos verursacht.

Dies ist auch nützlich, wenn:

  • Es besteht ein Konflikt zwischen der Foo -Methode einer Schnittstelle und der Foo -Methode Ihres eigenen Typs, und sie bedeuten verschiedene Dinge
  • Es gibt einen Signaturkonflikt zwischen anderen Schnittstellen

Das typische Beispiel für den letzten Punkt ist IEnumerable<T> , das eine GetEnumerator() -Methode auf zwei Ebenen in der Schnittstellenhierarchie hat - es ist üblich, die typisierte ( IEnumerator<T> ) Version mit impliziter Implementierung und die nicht typisierte Version zu implementieren ( IEnumerator ) Version mit expliziter Implementierung.

    
Marc Gravell 03.04.2009 05:42
quelle
6

Hier ist der Unterschied in einfachem Englisch:

Angenommen, Sie haben eine Schnittstelle Machine , die eine Funktion Run() hat, und eine andere Schnittstelle Animal , die auch eine Funktion namens Run() hat. Natürlich, wenn eine Maschine läuft, reden wir davon, dass sie startet, aber wenn ein Tier rennt, reden wir darüber, dass es sich bewegt. Also, was passiert, wenn Sie ein Objekt haben, nennen wir es Aibo , das ist sowohl ein Machine als auch ein Animal ? (Aibo ist übrigens ein mechanischer Hund.) Wenn Aibo läuft, startet er oder bewegt er sich? Durch die explizite Implementierung einer Schnittstelle können Sie diese Unterscheidung treffen:

%Vor%

Der Haken hier ist, dass ich nicht einfach a.Run() aufrufen kann, weil beide meiner Implementierungen der Funktion explizit an eine Schnittstelle angehängt sind. Das macht Sinn, denn woher sollte sonst der Compiler wissen, wen er anruft? Wenn ich stattdessen die Funktion Run() direkt auf meinem Aibo aufrufen möchte, muss ich auch diese Funktion ohne eine explizite Schnittstelle implementieren.

    
tylerl 03.04.2009 08:04
quelle
4

Explicit wird IInterfaceName eingeben. an der Front aller Schnittstellenimplementierungen. Es ist nützlich, wenn Sie zwei Schnittstellen implementieren müssen, die Namen / Signaturen enthalten, die kollidieren.

Weitere Informationen hier .

    
Steven Robbins 03.04.2009 05:38
quelle
1

Explizit implementieren setzt den vollständig qualifizierten Namen auf den Funktionsnamen, beachten Sie diesen Code

%Vor%     
Al W 03.04.2009 05:45
quelle
0

Hier geht's direkt von MSDN

    
Baget 03.04.2009 05:37
quelle
0

Der Unterschied besteht darin, dass Sie eine Klasse von mehreren Schnittstellen erben können. Diese Schnittstellen können identische Methodensignaturen haben. Eine explizite Implementierung ermöglicht es Ihnen, Ihre Implementierung entsprechend der Schnittstelle zu ändern, mit der sie aufgerufen wurde.

    
SirDemon 03.04.2009 05:38
quelle
0

Eine explizite Schnittstellenimplementierung, bei der die Implementierung verborgen bleibt, sofern Sie nicht explizit umwandeln, ist am nützlichsten, wenn die Schnittstelle orthogonal zur Klassenfunktionalität ist. Das heißt, verhaltensmäßig nicht verwandt.

Wenn Ihre Klasse beispielsweise Person ist und die Schnittstelle ISerializable ist, macht es für jemanden, der sich mit Person-Attributen beschäftigt, wenig Sinn, etwas Seltsames namens 'GetObjectData' über Intellisense zu sehen. Möglicherweise möchten Sie daher die Schnittstelle explizit implementieren.

Andererseits, wenn Ihre Personenklasse zufällig IAddress implementiert, macht es Sinn, Mitglieder wie AddressLine1, ZipCode usw. direkt auf den Instanzen von Person zu sehen (implizite Implementierung).

    
James L 03.04.2009 07:10
quelle

Tags und Links