C # Interface- und Basisklassen

7

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?

    
Paul 18.01.2012, 15:51
quelle

8 Antworten

10

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%     
Esoteric Screen Name 18.01.2012, 15:55
quelle
6

Da BaseEvents bereits IEventRepository implementiert, müssen Sie es nicht erneut in FooBarEvents implementieren. FooBarEvents erbt automatisch BaseEvents 'Implementierung.

    
Chris Shain 18.01.2012 15:53
quelle
3

Warum definieren Sie Ihre Methoden in der Basisklasse nicht als Virtual und überschreiben die, die Sie in der untergeordneten Klasse ändern möchten?

    
pencilCake 18.01.2012 15:55
quelle
3

Der folgende Code zeigt, wie eine allgemeine Implementierung einiger Schnittstellenmethoden mit einer abstrakten Basisklasse bereitgestellt und benutzerdefinierte Implementierungen für andere bereitgestellt werden können.

%Vor%

}

    
Jason 18.01.2012 16:03
quelle
2

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.

    
Sachin Kainth 18.01.2012 15:54
quelle
2

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.

    
InBetween 18.01.2012 15:56
quelle
0

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.

    
Samuel Slade 18.01.2012 15:55
quelle
0

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.

    
Jon Hanna 18.01.2012 16:16
quelle

Tags und Links