2013-02-17 10 views
6

Ich schreibe ein einfaches Spiel und viele der Spielobjekte teilen Attribute. Ich habe zwei mögliche Implementierungen dafür.Sollte ich in diesem Fall Vererbung oder Komposition verwenden?

Die erste ist mit Vererbung, wie im folgenden Bild angegeben:

Class Hierarchy

Die fett gedruckten Klassen die abstrakte Klassen sind, wie man erwarten könnte. Die Zweige sind die abgeleiteten Klassen, die tatsächlich verwendet werden. Es ist wichtig zu beachten, dass diese Klassen Daten über die Objekte enthalten, denen keine Funktionalität zugeordnet ist.

Trupp und Fahrzeug zum Beispiel haben eine gemeinsame Schnittstelle, die sie beide verwenden, um Dinge wie attack() und move() zu tun. Die oben skizzierte Klassenhierarchie ist nur die Rohstatistik. Darüber hinaus sind sie alle echte ISA-Beziehungen.

Die zweite Implementierung verwendet Zusammensetzung. Anstelle der obigen Klassenhierarchie sind alle abstrakten Klassen stattdessen "Module", die bestimmte Datenelemente enthalten. So hat SpecialAbility ein Datenelement namens PointsValueObject (obwohl ich die Namen der abstrakten Klassen geändert habe, obwohl sie nicht mehr abstrakt sind), um ihre Modularität/Attributnatur widerzuspiegeln. Und Troop hat Datenmitglieder: PointsValueObject, PhysicalObject, PhysicalAttackObject und BattleOBject, wobei jeder dieser Module Module enthält, die Daten über die Truppe enthalten. Auch in diesen Modulen gibt es keine Funktionalität, sie werden nur zum Speichern von Daten verwendet. Verhalten und Funktionalität werden weiterhin über Interface-Klassen implementiert.

Meine Frage ist dies: Leute bevorzugen im Allgemeinen Zusammensetzung über Vererbung, aber in diesem Fall bin ich geneigt, mit Vererbung zu bleiben, da die ISA-Beziehungen gelten und die Hierarchie enthält keine Verhaltensweisen, nur Daten. Ist diese Hierarchie gut, oder baut man die Klassen mit dem Attribut 'Module' besser?

+1

Der Ansatz "Module" ähnelt einem komponentenbasierten [Entitätssystem] (http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of) -mmog-development-part-1 /) allgemein bei der Spieleentwicklung verwendet. Es beinhaltet einige zusätzliche Komplexität, aber es ist wirklich schön für Wiederverwendbarkeit und Erweiterbarkeit. Ich weiß nicht, was besser wäre, jeder Ansatz hat seine Vor- und Nachteile, aber es liegt an dir, sie auszugleichen und zu entscheiden, welcher Ansatz besser zu deinem Problem passt. – asermax

Antwort

4

Wenn kein Code wiederverwendet wird, welchen Vorteil sehen Sie bei der Verwendung der Vererbung? Die Vererbung ist nützlich für DRY (Do not Repair Yourself), wenn das Verhalten gleich ist, aber ohne Verhalten beschränkt sich alles, was Sie tun, möglicherweise auf Sie selbst. Wenn Sie später entscheiden, dass Sie eine Unterhierarchie haben, die weniger Daten benötigt, gibt es keine gute Lösung dafür.

+0

Sorry, was bedeutet DRY? – Slims

+0

Wiederhole dich nicht – KidTempo

Verwandte Themen