Allgemein ist es so, dass Vererbung etwas sehr tolles ist. Ich nutze es aber zumindest bei kleinen Spielen ziemlich moderat. Nämlich genau da, wo ich wirklich einen Vorteil sehe. Vererbung hat den Nachteil, dass du eine sehr enge Bindung zu deinen Vaterklassen erzeugst. Wenn man zu große Klassen vererbt, kann das in einem ziemlich wüsten überschreiben von Eigenschaften enden - über mehrere Ebenen. Manchmal ist es klüger, eine hat-Beziehung zu verwenden, wie es dein Beispiel gerade zeigt. Durch die Vererbung hast du dir sehr viel Einengung erzeugt.
Also: Nutze Vererbung weise. Im Zweifel nutze eine hat-Beziehung (auch Containment genannt) und du sparst dir viel Ärger. Ich habe bei meinen Spielen konkret selten mehr als 3 Vererbungsebenen - wovon 2 abstrakt waren. Das muss aber nicht immer so sein
EDIT: Zusätzlich, wo ich den Titel noch einmal lese: Öffentliche Schnittstellen sind meiner Erfahrung nach ein ziemlich guter Indiz, ob deine Klassen gut aufgebaut sind. Damit meine ich natürlich alle öffentlichen Methoden einer Klasse.
- Initialisieren kontruktoren deine Objekte vollständig?
- Hast du wenn möglich weniger als eine Hand voll Parameter für alle deine öffentlichen funktionen?
- Ist Redundanzfreiheit konsequent gewährleistet?
- Hast du deine Zuständigkeiten in den Klassen möglichst sauber getrennt?
- Kannst du nach zwei Monaten deiner Methode noch ansehen, was sie zumindest in etwa tun soll?
Ich habe bei jedem veröffentlichen einer Methode im Kopf, ob das wirklich notwendig ist. Prinzipiell ist es so, dass man bei der Verwendung eines objektes nämlich genau auf diese schaut. Je weniger es gibt, umso besser kann man das Objekt benutzen.