Eine schnelle Suche in diesem Stapelaustausch zeigt, dass die Komposition im Allgemeinen als flexibler als die Vererbung angesehen wird, aber wie immer vom Projekt usw. abhängt und es Zeiten gibt, in denen die Vererbung die bessere Wahl ist. Ich möchte ein 3D-Schachspiel machen, bei dem jede Figur ein Netz hat, möglicherweise unterschiedliche Animationen und so weiter. In diesem konkreten Beispiel scheint es so, als könnten Sie für beide Ansätze argumentieren. Bin ich falsch?
Die Vererbung würde ungefähr so aussehen (mit dem richtigen Konstruktor usw.)
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
was sicherlich dem "is-a" -Prinzip gehorcht, während die Komposition ungefähr so aussehen würde
class MovementComponent
{
virtual Squares GetValidMoveSquares() = 0;
}
class PawnMovementComponent
{
Squares GetValidMoveSquares() override;
}
enum class Type
{
PAWN,
BISHOP, //etc
}
class Piece
{
MovementComponent* movementComponent;
MeshComponent* mesh;
Type type;
// Other fields
}
Ist es eher eine Frage der persönlichen Präferenz oder ist ein Ansatz hier eindeutig eine klügere Wahl als der andere?
EDIT: Ich glaube, ich habe aus jeder Antwort etwas gelernt, deshalb fühle ich mich schlecht, wenn ich nur eine auswähle. Meine endgültige Lösung wird von einigen der Beiträge hier inspiriert sein (die noch daran arbeiten). Vielen Dank an alle, die sich die Zeit genommen haben zu antworten.
var Pawn = new Piece(howIMove, howITake, whatILookLike)
scheint mir viel einfacher, überschaubarer und wartbarer zu sein als eine Vererbungshierarchie.