684 Stimmen

C#-Schnittstellen. Implizite Implementierung versus explizite Implementierung

Was sind die Unterschiede bei der Implementierung von Schnittstellen? implizit y ausdrücklich in C#?

Wann sollten Sie implizit und wann explizit verwenden?

Gibt es Vor- und/oder Nachteile für das eine oder das andere?


Die offiziellen Richtlinien von Microsoft (aus der ersten Ausgabe Rahmengestaltungsrichtlinien ) besagt, dass die Verwendung expliziter Implementierungen wird nicht empfohlen , da der Code dadurch ein unerwartetes Verhalten zeigt.

Ich denke, diese Leitlinie ist sehr gültig in einer Vor-IoC-Zeit wenn Sie die Dinge nicht als Schnittstellen weitergeben.

Könnte jemand auch auf diesen Aspekt eingehen?

0 Stimmen

Vollständigen Artikel über C#-Schnittstellen lesen : planetofcoders.com/c-schnittstellen

1 Stimmen

Ja, explizite Schnittstellen sollten vermieden werden, und ein professionellerer Ansatz wäre die Implementierung von ISP (Schnittstellentrennungsprinzip) - hier ein ausführlicher Artikel dazu codeproject.com/Artikel/1000374/

0 Stimmen

In den meisten Fällen werden Schnittstellen nicht benötigt, denken Sie darüber nach, wer Ihren Code verwendet, niemand, also verschwenden Sie keine Zeit mit dem Versuch, die besten Schnittstellen zu implementieren, Schnittstellen erhöhen nur die Komplexität des Projekts und führen zu mehr Funktionsfehlern, als es sein sollte

5voto

Marc Sigrist Punkte 3634

Die vorangegangenen Antworten erklären, warum es sinnvoll sein kann, eine Schnittstelle explizit in C# zu implementieren bevorzugt (meist aus formalen Gründen). Es gibt jedoch eine Situation, in der eine explizite Implementierung obligatorisch : Um zu vermeiden, dass die Kapselung verloren geht, wenn die Schnittstelle nicht public , aber die implementierende Klasse ist public .

// Given:
internal interface I { void M(); }

// Then explicit implementation correctly observes encapsulation of I:
// Both ((I)CExplicit).M and CExplicit.M are accessible only internally.
public class CExplicit: I { void I.M() { } }

// However, implicit implementation breaks encapsulation of I, because
// ((I)CImplicit).M is only accessible internally, while CImplicit.M is accessible publicly.
public class CImplicit: I { public void M() { } }

Die oben erwähnte Leckage ist unvermeidbar, da nach der C#-Spezifikation "Alle Mitglieder der Schnittstelle haben implizit öffentlichen Zugriff". Infolgedessen müssen implizite Implementierungen auch public Zugang, auch wenn die Schnittstelle selbst z. B. internal .

Implizite Schnittstellenimplementierung in C# ist eine große Erleichterung. In der Praxis verwenden viele Programmierer sie die ganze Zeit/überall ohne weitere Prüfung. Dies führt im besten Fall zu unübersichtlichen Typoberflächen und im schlimmsten Fall zu undichter Kapselung. Andere Sprachen, wie z. B. F#, es nicht einmal erlauben .

3voto

nrodic Punkte 2993

Eine wichtige Anwendung der expliziten Schnittstellenimplementierung ist die Notwendigkeit, Schnittstellen mit gemischte Sichtbarkeit .

Das Problem und die Lösung werden in dem Artikel gut erklärt C# Interne Schnittstelle .

Wenn Sie z. B. das Durchsickern von Objekten zwischen Anwendungsschichten verhindern wollen, können Sie mit dieser Technik unterschiedliche Sichtbarkeiten von Mitgliedern festlegen, die das Durchsickern verursachen könnten.

1voto

marsze Punkte 13251

Ich habe mich dabei ertappt, dass ich ausdrücklich Umsetzungen in letzter Zeit häufiger, und zwar aus folgenden Gründen praktisch Gründe:

  • Durch die Verwendung der expliziten Bezeichnung von Anfang an wird verhindert, dass es zu Namenskollisionen kommt, bei denen ohnehin eine explizite Implementierung erforderlich wäre.

  • Die Verbraucher werden "gezwungen", das Schnittstelle anstelle der Implementierung (also nicht "Programmierung für eine Implementierung" ), was sie ohnehin tun sollten/müssen, wenn Sie DI verwenden

  • Keine "Zombie"-Mitglieder in den Implementierungen - das Entfernen eines Mitglieds aus der Schnittstellendeklaration führt zu Compilerfehlern, wenn es nicht auch aus der Implementierung entfernt wird

  • Standardwerte für optionale Parameter sowie Einschränkungen für generische Argumente werden automatisch übernommen - es ist nicht nötig, sie zweimal zu schreiben und synchron zu halten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X