Ich habe eine Reihe von Systemen, nennen wir sie A, B, C, D, E, F, G, H, I, J
.
Sie haben alle ähnliche Methoden und Eigenschaften. Einige enthalten genau die gleiche Methode und Eigenschaften, einige können leicht variieren und einige können sehr unterschiedlich sein. Im Moment habe ich viel Code für jedes System dupliziert. Zum Beispiel habe ich eine Methode namens GetPropertyInformation()
, die für jedes System definiert ist. Ich versuche herauszufinden, welche Methode der beste Weg wäre, um doppelten Code zu reduzieren, oder vielleicht ist eine der folgenden Methoden nicht der richtige Weg:
Schnittstelle
%Vor%Zusammenfassung
%Vor%Virtuelle Methoden in einer Super Base-Klasse
%Vor% Eine Frage, obwohl es vielleicht dumm ist, ist, dass ich mit dem abstrakten Ansatz gegangen bin und ich den GetPropertyInformation
überschreiben wollte, aber ich musste einen zusätzlichen Parameter übergeben, ist das möglich oder müsste ich erstellen eine andere Methode in der abstrakten Klasse? Zum Beispiel GetPropertyInformation(x)
Ihre abstrakten und "Super-Basisklassen" -Ansätze sind nicht zu unterschiedlich. Sie sollten die Basisklasse immer abstrakt machen und eine Standardimplementierung (virtuelle Methoden) oder nicht (abstrakte Methoden) bereitstellen. Der entscheidende Faktor ist, ob Sie jemals Instanzen der Basisklasse haben wollen, denke ich nicht.
Es liegt also zwischen der Basisklasse und der Schnittstelle. Wenn zwischen Ihren A-, B C-Klassen eine starke Kopplung besteht, können Sie eine Basisklasse und wahrscheinlich eine gemeinsame Implementierung verwenden.
Wenn die A-, B-, C-Klassen nicht zu einer einzelnen "Familie" gehören, dann verwenden Sie eine Schnittstelle.
Und System
ist kein so guter Name.
Sie können die Parameterliste beim Überschreiben nicht ändern. Vielleicht können Standard-Parameter helfen, sonst brauchen Sie nur 2 Überladungen für GetPropertyInformation ().
Im Allgemeinen wählen Sie die Objektvererbung aus, wenn Sie die Implementierung freigeben und reduzieren möchten, was andernfalls eine Duplizierung wäre. Andernfalls gewinnen Schnittstellen, weil sie flexibler sind, da keine gemeinsame Basisklasse benötigt wird.
Wie beim Überschreiben einer Methode und Ändern der Parameterliste ist das einfach nicht möglich. Stellen Sie sich vor, wie Sie diese Methode für eine Basisklasse oder eine Schnittstellenreferenz aufrufen würden?
Sie können den zusätzlichen Parameter nicht in der Überschreibung übergeben. Wenn Sie überschreiben, überschreiben Sie die Methode mit der genauen Signatur. Ich würde vorschlagen, dass Sie einen Schnittstellenparameter wie IPropertyInformation
übergeben, der sich pro Implementierung ändern kann.
Die Entscheidung, mit einer Basisklasse oder einer Schnittstelle für Ihre Implementierung zu gehen, hängt von Ihrer Verwendung ab. Haben A-I
genug miteinander, dass sie eigentlich alle von derselben Basisklasse stammen sollten? Wenn ja, dann verwende eine Basisklasse. Ist es wirklich so, dass nur GetPropertyInformation
geteilt wird und ansonsten die Systeme völlig funktional verschieden sind? Dann wollen Sie wirklich nur, dass sie eine Schnittstelle teilen.
Andere haben behandelt, was ursprünglich in meiner Antwort war, aber über den Punkt "einen Parameter hinzufügen": Vergessen Sie nicht, dass das neueste C # auch optionale Parameter in Methoden haben kann.
Wenn Sie sonst keinen zwingenden Grund haben, würde ich mit der Schnittstelle gehen. Öffentliche virtuelle Methoden, obwohl viel getan, ist nicht ideal .
Tags und Links c# oop interface abstract-class virtual-method