C# - Interface-und base-Klassen
Ich habe ein C# - interface, und eine konkrete Klasse, die diese Schnittstelle implementiert. Ich will jetzt erstellen Sie eine weitere Klasse, die diese Schnittstelle implementiert. Einfach genug.
Jedoch die meisten Methoden werden genau das gleiche in den Klassen, und nur ein paar Methoden geändert werden.
Ich nicht duplizieren wollen alle die Logik in meiner 2. Klasse, die in meiner ersten.
Wie erstelle ich die 2. Klasse, und verwenden Sie die Logik in meiner ersten Klasse, außer für die extra Sachen?
Meine Schnittstelle heißt IEventRepository, und meine 1. Klasse ist genannt BaseEvents. Ich möchte nun erstellen wir eine neue Klasse namens FooBarEvents.
Meiner Klasse definition für FooBarEvents ist:
public class FooBarEvents : BaseEvents, IEventRepository
Meine Absicht war, dann mit der return-Basis.Methode() jede Methode, die Duplikate code.
Ich nehme an, das ist nicht richtig?
- Genau, warum sind Sie über eine Schnittstelle?
Du musst angemeldet sein, um einen Kommentar abzugeben.
FooBarEvents
sollten nur brauchen, um Erben vonBaseEvents
, nicht auch umsetzenIEventRepository
alsBaseEvents
bereits implementiert das interface. Wenn Sie brauchen, um das Verhalten von einigenIEventRepository
Methoden inFooBarEvents
einfach überschreiben dieser Methoden.Edit: einige Beispiele
FooBarEvents
aber, dass Sie dem hinzufügen müssten, Signaturen dieser Ereignisse zuBaseEvents
um Sie zu überschreiben? Das ist nicht der Fall; Sie können fügen Sie einfach die Implementierungen direkt zuFooBarEvents
. Ich werde mein edit beantworten und fügen Sie ein Beispiel.BaseEvents
braucht eine eigene Linie für jede Methode in der Schnittstelle. In diesem Fall sollten Sie erklärenBaseEvents
alsabstract
fügen Sie die fehlenden Unterschriften der Klasse (auch alsabstract
) implementieren Sie die gängigen Methoden (von der Oberfläche), und verwenden SieBaseEvents
als Ihren Vertrag zu geben, anstattIEventRepository
. Auf diese Weise, Sie sicherstellen, dass alle Vertrag haben die Verbraucher Zugang zu den gängigen Implementierungen (wie codiert inBaseEvents
), aber alles, was benötigt werden client-spezifisch (D. H., umgesetzt inFooBarEvents
werden, noch der konkreten Klasse die benutzerdefinierte version. Wird Bearbeiten.Seit
BaseEvents
bereits implementiertIEventRepository
Sie nicht implementieren müssen, um es wieder inFooBarEvents
.FooBarEvents
erbt automatischBaseEvents
Umsetzung.Warum nicht, definieren Sie Ihre Methoden in der Basisklasse als
Virtual
und überschreiben diejenigen, die Sie ändern möchten, in der Kind-Klasse?Folgende code zeigt, wie eine gemeinsame Umsetzung einiger Methoden der Schnittstelle mit einer abstrakten Basisklasse, und benutzerdefinierte Implementierungen für andere.
}
Können Sie machen Sie Ihre zweite Klasse, verlängern Sie Ihre erste Klasse. Ihre erste Klasse kann Abstrakt sein, sondern nur implementieren, die häufigsten Methoden aus dem interface.
Verwenden Sie Vererbung:
BarOnSteroids
wird alles Erben, VerhaltenBar
und Sie verändern können das spezifische Verhalten von Methoden, die Sie benötigen, durch überschreiben Sie inBarOnSteroids
(Sie müssen gekennzeichnet werden als virtual in der BasisklasseBar
).Diese Weise würden Sie haben die folgenden:
Dies setzt Voraus, Sie ändern möchten spezifische Verhalten von Methoden, die ein Teil der
IFoo
- Schnittstelle. Wenn alles, was Sie wollen, ist, um zusätzliche Funktionalität hinzufügen, umBarOnSteroids
dann einfach Erben formBar
zu Erben all seiner Funktionen, und fügen Sie alle erforderlichen neuen Methoden für die Umsetzung der neuen Funktionalität.Bar
undBarOnSteroids
umsetzen mussSpecificBehaviorMethod1
denn diese Methode ist Teil derIFoo
Vertrag. Der Fall, dassSpecificBehaviorMethod
ist virtuell, es wird rufen der Umsetzung spezifisch auf den tatsächlichen Typ der Instanz, die Sie ruft.Wenn eine bestimmte Auswahl von Methoden in der
BaseEvents
Umsetzung vonIEventRepository
sind immer pflegen die gleiche Umsetzung, dann können Sie einfach implementieren diese in derBaseEvents
Klasse und markieren Sie diejenigen, die könnte ändern, wievirtual
. So, wennFooBarEvents
möchte, ändern Sie die Implementierung der Methoden, können Sie einfach überschreiben.Nur ein Hinweis mit Bezug auf das hinzufügen
IEventsRepository
zu IhremFooBarEvents
Klasse: es gilt, das zu tun. Sehen hier für eine Jon Skeet Antwort darüber.Gibt es ein paar verschiedene Ansätze.
Einer. Überspringen Sie die Oberfläche vollständig, und machen es eine abstrakte Klasse. Dies ist einfacher, wenn es funktioniert, aber die Tatsache, dass Sie können nur eine Basis-Klasse schränkt die Verwendung in C#
Können Sie eine Klasse, die die Schnittstelle implementieren, und eine andere daraus ziehen:
Haben Sie beide überschreiben einer abstrakten Klasse, gibt es einige gemeinsame Verhaltensweisen:
Könnten Sie auch eine statische helper-Klasse, die nichts zu tun hat mit der Hierarchie, aber nicht, Methoden bereitzustellen, die nützlich sind bei der Umsetzung der Funktionalität.
Seien Sie vorsichtig wenn Sie dieses Muster:
Selbst wenn
IEventRepository.Method1
definiert ist sinnvoller, die oben ist wahrscheinlich zu Verwirrung führen.