Frage

ähnliche Frage aber nicht ganz die gleiche Sache

Ich dachte, dass mit Erweiterungsmethoden im gleichen Namensraum wie die Schnittstelle Sie einen ähnlichen Effekt zu Mehrfachvererbung, dass Sie benötigen, um doppelten Code nicht haben bekommen konnten die gleiche Schnittstelle die gleiche Art und Weise in 10 verschiedenen Klassen implementieren.

Was sind einige der Nachteile, dies zu tun? Ich denke, dass die Profis ziemlich offensichtlich sind, ist es die Nachteile ist, die in der Regel zurück kommen, um dich zu beißen später.

Einer der Nachteile sehe ich darin, dass die Erweiterungsmethoden nicht virtuell sein können, so dass Sie sicher sein müssen, dass man sie eigentlich will die gleiche Art und Weise für jede Instanz implementiert.

Keine korrekte Lösung

Andere Tipps

Das Problem, das ich mit dem Aufbau Schnittstellenfähigkeit über Erweiterungsmethoden sehen ist, dass Sie nicht länger sind tatsächlich die Schnittstelle implementieren und so das Objekt nicht als Schnittstellentyp verwenden kann.

Sagen, dass ich eine Methode, die ein Objekt vom Typ IBar nimmt. Wenn ich die IBar Schnittstelle auf Klasse Foo über Erweiterungsmethoden implementieren, dann ist Foo nicht von IBar ableiten und nicht austauschbar mit ihm (Liskov Substitution Prinzip) verwendet werden kann. Klar, habe ich das Verhalten, das ich Foo hinzugefügt werden soll, aber ich verliere den wichtigsten Aspekt der Schnittstellen in erster Linie der Schaffung - in der Lage, einen abstrakten Vertrag zu definieren, die in einer Vielzahl von Möglichkeiten, mit verschiedenen Klassen implementiert werden können, so dass abhängige Klassen wissen müssen nicht über konkrete Implementierungen.

Wenn ich die Mehrfachvererbung erforderlich (und bisher habe ich ohne sie gelebt) schlecht genug, ich glaube, ich Zusammensetzung stattdessen verwenden würde, um die Menge an Code-Duplizierung zu minimieren.

Eine anständige Art und Weise, um darüber nachzudenken ist, dass die Instanzmethoden sind etwas getan von das Objekt, während Erweiterungsmethoden sind etwas getan das Objekt. Ich bin ziemlich sicher, dass die Rahmen-Design-Richtlinien sagen, man sollte eine Instanz Methode, wann immer möglich implementieren.

Eine Schnittstelle erklärt: „Ich kümmere mich um diese Funktionalität zu verwenden, aber nicht, wie es erreicht wird.“ Das läßt Implementierer die Freiheit, die, wie zu wählen. Sie entkoppelt die Absicht, eine öffentliche API, aus dem Mechanismus, eine Klasse mit konkretem Code.

Da dies der Hauptvorteil der Schnittstellen ist, deren Umsetzung vollständig als Erweiterungsmethoden ihren Zweck zu besiegen scheint. Auch IEnumerable<T> hat eine Instanzmethode.

Bearbeiten : Auch sind Objekte gemeint auf die Daten wirken sie enthalten. Erweiterungsmethoden können nur ein Objekt der öffentlichen API sehen (wie sie sind nur statische Methoden); Sie müssten alle den Zustand eines Objekts belichten, um es (no-no eine OO) arbeiten zu lassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top