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?
Nach meiner Erfahrung gibt es zwei Hauptverwendungen:
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. 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. Ein Beispiel ist ICloneable . Wenn Sie es explizit implementieren, können Sie immer noch eine stark typisierte Version haben:
%Vor%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.
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.