Ich halte es für cool, wenn sowohl Troll als auch Werwolf ihre Attribute vom Feind erbten und einige von ihnen überschrieben.
Leider hat sich diese in den 90er Jahren beliebte Herangehensweise an Polymorphismus in der Praxis als schlechte Idee erwiesen. Stellen Sie sich vor, Sie fügen der Feindesliste 'Wolf' hinzu - nun, es teilt einige Attribute mit Werwolf, so dass Sie diese in einer gemeinsam genutzten Basisklasse zusammenfassen möchten, z. "Wolfsähnlich". Jetzt fügst du der feindlichen Liste "Mensch" hinzu, aber Werwölfe sind manchmal Menschen, sodass sie auch Attribute gemeinsam haben, wie z. B. auf zwei Beinen gehen, sprechen können usw. Schaffst du eine "humanoide" gemeinsame Basis für Menschen und Werwölfe? , und müssen Sie dann aufhören, Werwölfe von WolfLike abzuleiten? Oder erben Sie mehrfach von beiden - in welchem Fall hat welches Attribut Vorrang, wenn etwas in Humanoid mit etwas in WolfLike kollidiert?
Das Problem ist, dass das Versuchen und Modellieren der realen Welt als Klassenbaum wirkungslos ist. Nehmen Sie 3 beliebige Dinge und Sie können wahrscheinlich 4 verschiedene Möglichkeiten finden, um ihr Verhalten in gemeinsam genutzte und nicht gemeinsam genutzte zu zerlegen. Aus diesem Grund haben viele ein modulares oder komponentenbasiertes Modell gewählt, bei dem ein Objekt aus mehreren kleineren Objekten besteht, aus denen das Ganze besteht. Die kleineren Objekte können ausgetauscht oder geändert werden, um das gewünschte Verhalten zu erzielen. Hier haben Sie vielleicht nur 1 Feindklasse, und sie enthält Unterobjekte oder Komponenten für das Gehen (z. B. Bipedal vs. Quadrupedal), seine Angriffsmethoden (z. B. Biss, Klaue, Waffe, Faust), seine Haut (grün) für Trolle, pelzig für Werwölfe und Wölfe usw.
Dies ist immer noch vollständig objektorientiert, aber die Vorstellung, was ein nützliches Objekt ist, unterscheidet sich von dem, was früher in den Lehrbüchern gelehrt wurde. Anstatt einen großen Vererbungsbaum mit verschiedenen abstrakten Klassen und mehreren konkreten Klassen an den Baumspitzen zu haben, haben Sie normalerweise nur eine konkrete Klasse, die ein abstraktes Konzept darstellt (z. B. "Feind"), die jedoch konkretere Klassen enthält, die abstraktere Konzepte darstellen (zB Anfälle, Hauttyp). Manchmal können diese zweiten Klassen am besten über eine Vererbungsebene implementiert werden (z. B. eine Basis-Angriffsklasse und mehrere abgeleitete Klassen für bestimmte Angriffe), aber der Deep-Inheritance-Baum ist weg.
Aber vielleicht ist der Unterricht zu schwer, um praktisch zu sein, ich weiß nicht ...
In den meisten modernen Sprachen sind Klassen nicht "schwer". Sie sind nur eine andere Art, Code zu schreiben, und sie verpacken normalerweise nur den prozeduralen Ansatz, den Sie ohnehin geschrieben hätten, außer mit einer einfacheren Syntax. Schreiben Sie aber auf keinen Fall eine Klasse, in der eine Funktion funktioniert. Klassen sind an sich nicht besser, nur dort, wo sie die Verwaltung oder das Verständnis des Codes erleichtern.