Interface, Abstract oder nur virtuelle Methoden?

8

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)

    
Xaisoft 28.09.2011, 20:24
quelle

6 Antworten

6

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 ().

    
Henk Holterman 28.09.2011, 20:31
quelle
3

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?

    
David Heffernan 28.09.2011 20:30
quelle
3

Ich würde mit etwas gehen, was ich unten hinzugefügt habe. Sie profitieren immer noch von dem Schnittstellenvertrag und der gemeinsamen Implementierung.

%Vor%     
scottm 28.09.2011 20:32
quelle
2

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.

    
skaz 28.09.2011 20:32
quelle
2

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.

    
millimoose 28.09.2011 20:34
quelle
2

Wenn Sie sonst keinen zwingenden Grund haben, würde ich mit der Schnittstelle gehen. Öffentliche virtuelle Methoden, obwohl viel getan, ist nicht ideal .

    
Eric Farr 28.09.2011 20:37
quelle