Ist die explizite Schnittstellenimplementierung zum Verbergen der Funktionalität gedacht?

7

Ich benutze Schnittstellen, um meinen Code zu entkoppeln. Ich bin neugierig, ist die Verwendung von expliziten Interface-Implementierung zum Verstecken der Funktionalität gemeint?

Beispiel:

%Vor%

Was ist der Nutzen und der spezifische Anwendungsfall, dies nur explizit über die Schnittstelle zur Verfügung zu stellen?

    
PRASHANT P 25.05.2011, 19:35
quelle

4 Antworten

11

Nach meiner Erfahrung gibt es zwei Hauptverwendungen:

  • Es erlaubt Ihnen, Methoden durch Rückgabewert zu überladen. Zum Beispiel deklarieren IEnumerable<T> und IEnumerable GetEnumerator() -Methoden, aber mit unterschiedlichen Rückgabetypen - um beide zu implementieren, müssen Sie mindestens einen davon explizit implementieren. Natürlich werden in dieser Frage beide Methoden von Interfaces bereitgestellt, aber manchmal möchten Sie einfach eine "normale" Methode mit einem anderen (normalerweise spezifischeren) Typ als den von der Interface-Methode geben.
  • Es ermöglicht Ihnen, einen Teil einer Schnittstelle auf "entmutigende" Weise zu implementieren - beispielsweise ReadOnlyCollection<T> implementiert IList<T> , "entmutigt" jedoch die mutierenden Aufrufe mithilfe der expliziten Schnittstellenimplementierung. Dies wird Anrufer, die von einem konkreten Objekt wissen, davon abhalten, unangemessene Methoden aufzurufen. Dies riecht etwas nach Schnittstellen, die zu breit oder unpassend implementiert sind - warum würden Sie eine Schnittstelle implementieren, wenn Sie nicht alle ihre Verträge erfüllen könnten? - Aber in einem pragmatischen Sinn kann es nützlich sein.
Jon Skeet 25.05.2011, 19:38
quelle
4

Ein Beispiel ist ICloneable . Wenn Sie es explizit implementieren, können Sie immer noch eine stark typisierte Version haben:

%Vor%     
CodeNaked 25.05.2011 19:38
quelle
2

Es ist nicht dazu gedacht, Methoden zu verstecken, sondern es zu ermöglichen, zwei Methoden mit derselben Signatur / demselben Namen von verschiedenen Schnittstellen auf verschiedene Arten zu implementieren.

Wenn sowohl IA als auch IB die Operation F haben, können Sie für jede F nur eine andere Methode implementieren, indem Sie die Schnittstellen explizit implementieren.

    
Erno de Weerd 25.05.2011 19:38
quelle
2

Es kann zum Verstecken verwendet werden. Zum Beispiel einige Klassen, die IDisposable explizit implementieren, weil sie auch eine Close() -Methode haben, die dasselbe tut.

Sie können die expliziten Schnittstellendefinitionen auch verwenden, wenn Sie zwei Interfaces in einer Klasse implementieren und ein Signaturkonflikt vorliegt. Die Funktionalität hängt von der Schnittstelle ab. Wenn dies jedoch geschieht, ist dies normalerweise ein Zeichen dafür, dass Ihre Klasse zu viel tut, und Sie sollten die Funktionalität ein wenig aufteilen.

    
Colin Mackay 25.05.2011 19:38
quelle

Tags und Links