Ich habe eine C # -Schnittstelle und eine konkrete Klasse, die diese Schnittstelle implementiert. Ich möchte jetzt eine andere Klasse erstellen, die diese Schnittstelle implementiert. Einfach genug.
Allerdings werden die meisten Methoden in den Klassen genau gleich sein und nur einige Methoden werden sich tatsächlich ändern.
Ich möchte nicht alle Logik in meiner 2. Klasse duplizieren, die in meinem ersten enthalten ist.
Wie erstelle ich die 2. Klasse und benutze die Logik in meiner ersten Klasse außer für die zusätzlichen Sachen?
Meine Schnittstelle heißt IEventRepository und meine erste Klasse heißt BaseEvents. Ich möchte jetzt eine neue Klasse namens FooBarEvents erstellen.
Meine Klassendefinition für FooBarEvents ist:
%Vor%Meine Absicht war, dann die Rückkehr base.Method () in jeder Methode zu verwenden, die den Code dupliziert.
Ich nehme an, das ist nicht korrekt?
FooBarEvents
sollte nur von BaseEvents
erben, nicht auch IEventRepository
implementieren, da BaseEvents
bereits die Schnittstelle implementiert. Wenn Sie das Verhalten einiger IEventRepository
-Methoden in FooBarEvents
ändern müssen, überschreiben Sie einfach diese Methoden.
Bearbeiten: einige Beispiele
%Vor% Da BaseEvents
bereits IEventRepository
implementiert, müssen Sie es nicht erneut in FooBarEvents
implementieren. FooBarEvents
erbt automatisch BaseEvents
'Implementierung.
Warum definieren Sie Ihre Methoden in der Basisklasse nicht als Virtual
und überschreiben die, die Sie in der untergeordneten Klasse ändern möchten?
Sie können Ihre zweite Klasse erweitern Ihre erste Klasse. Ihre erste Klasse kann abstrakt sein, aber nur die gängigen Methoden von der Schnittstelle implementieren.
Vererbung verwenden:
%Vor% BarOnSteroids
erbt das gesamte Verhalten von Bar
und Sie können das spezifische Verhalten aller Methoden ändern, indem Sie sie in BarOnSteroids
überschreiben (sie müssen in der Basisklasse Bar
als virtuell markiert sein).
Auf diese Weise haben Sie Folgendes:
%Vor% Dies setzt voraus, dass Sie das spezifische Verhalten von Methoden ändern möchten, die Teil der Schnittstelle IFoo
sind. Wenn Sie nur BarOnSteroids
zusätzliche Funktionalität hinzufügen möchten, erben Sie einfach form Bar
, um alle Funktionen zu erben und fügen Sie alle erforderlichen neuen Methoden hinzu, um die neue Funktionalität zu implementieren.
Wenn eine bestimmte Auswahl von Methoden in der BaseEvents
Implementierung von IEventRepository
immer dieselbe Implementierung beibehalten soll, können Sie sie einfach in der BaseEvents
Klasse implementieren und markieren diejenigen, die möglicherweise ändern, als virtual
. Auf diese Weise kann, wenn FooBarEvents
die Implementierung einer der Methoden ändern möchte, diese einfach überschreiben.
Nur eine Anmerkung bezüglich des Hinzufügens von IEventsRepository
zu Ihrer FooBarEvents
Klasse: es ist gültig das zu tun. Sehen Sie hier für eine Jon Skeet Antwort darüber.
Es gibt ein paar verschiedene Ansätze.
Eins. Überspringen Sie das Interface vollständig und machen Sie es zu einer abstrakten Klasse. Dies ist einfacher, wenn es funktioniert, aber die Tatsache, dass Sie nur eine Basisklasse haben können, beschränkt die Verwendung in C #
%Vor%Sie können festlegen, dass eine Klasse die Schnittstelle implementiert und eine andere davon abgeleitet wird:
%Vor%Sie müssen beide eine abstrakte Klasse überschreiben, die ein gemeinsames Verhalten ergibt:
%Vor%Sie können auch eine statische Hilfsklasse verwenden, die nichts mit der Hierarchie zu tun hat, aber Methoden bereitstellt, die bei der Implementierung der Funktionalität nützlich sind.
Seien Sie jedoch vorsichtig mit diesem Muster:
%Vor% Selbst wenn IEventRepository.Method1
vernünftiger definiert ist, führt das oben genannte wahrscheinlich zu Verwirrung.
Tags und Links c# inheritance oop