Frage

Welcher der beiden sollte bevorzugt werden?

Es gibt einige Methoden, die von Klasse A, B und C genannt werden

Sollten diese Methoden in einer Klasse D (Basis von A, B und C) eingekapselt werden?

ODER

Sollten diese Methoden in einer Klasse u eingekapselt werden und andere Klassen erstellt das Objekt, um die Methoden nach Bedarf zu verwenden.

Auf welcher Grundlage sollte Entscheidung getroffen werden?

Vielen Dank.

War es hilfreich?

Lösung

Sie sollten eine machen static Versorgungsklasse.

Verwenden Sie nur die Vererbung, wenn es tatsächlich sinnvoll ist - wenn A, B, und C eigentlich sind a D.

Andere Tipps

Ich würde die Entscheidung darauf stützen, was die Methoden tun, wenn sie Dinge für die Klassen A, B und C tun, sollten sie in der Basisklasse sein. Dies hilft, Code sauber zu halten, indem sie die klassenbezogene Funktionalität vor dem Rest des Systems fernst. (Natürlich gehe ich davon aus, dass A, B und C entweder bereits von D erben oder offensichtlich verwandt sind)

Wenn sie Dinge mit anderen Typen machen, die nicht inhärent sind, was A, B und C tun, sollten sie in einer Versorgungsklasse sein, um die Wiederverwendung zu maximieren.

Wenn sie Dinge mit anderen Typen tun, die spezifisch für diesen anderen Typ sind (z. B. ziemlich drücken Sie eine DateTime), sollten Sie sie Erweiterungsmethoden für vornehmen das Typ.

Ich würde mich von der Erbschaft fernhalten, wenn es nicht offensichtlich ist ist ein Beziehung. Ich vermute aus Ihrer Beschreibung oben, dass dies nicht der Fall ist. Meine bevorzugten Lösungen wären:

  1. injizieren Eine Instanz einer Versorgungsklasse in Ihr A, B, C.
  2. A, B, C haben die entsprechenden Versorgungsklassen instanziiert

Der Vorteil der Injektion der Klasse besteht darin, dass Sie trivial verschiedene Implementierungen bereitstellen können. Dies ist besonders zum Testen nützlich. Singletons oder Klassen mit statischen Methoden verursachen aus demselben Grund tendenziell Probleme - Sie können sie nicht leicht überschreiben oder ersetzen.

Verwenden Sie die BasisklasseWenn Sie je nach Basisklasse nur eine Logik schreiben möchten, ist es sinnvoll, eine Basisklasse zu erstellen. In diesem Fall sollte Ihre abgeleitete Klasse durch Ihre Basisklasse vollständig ersetzt werden. Es sollte keine Switch -Logik geben, um den abgeleiteten Typ zu überprüfen und entsprechend zu handeln. Siehe Liskov -Substitutionsprinzip: http://en.wikipedia.org/wiki/liskov_substitution_principle

Verwenden Sie die VersorgungsklasseEinige Sprachen haben die Einschränkung, dass sie das mehrfache Vererbung nicht unterstützen. Wenn Sie bereits eine aussagekräftige Basisklasse haben, müssen Sie sich für die Dienstprogrammklasse entscheiden. Wenn Sie die Vererbung verwenden, erzeugen Sie auch eine enge Kopplung zwischen der Derwied -Klasse bis zur Basisklasse.

Ich würde mich für die Basisklasse entscheiden, wenn die abgeleitete Klasse natürlich durch ihre Basisklasse ersetzt wird. Wenn der Zweck nur darin besteht, einen wiederverwendbaren Code zwischen den Klassen zu teilen, ist es sinnvoller, sich für die Versorgungsklasse zu entscheiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top