Szybkie wyszukiwanie tej wymiany stosów pokazuje, że ogólnie kompozycja jest ogólnie uważana za bardziej elastyczną niż dziedziczenie, ale jak zawsze zależy od projektu itp. I są chwile, kiedy dziedziczenie jest lepszym wyborem. Chcę stworzyć grę w szachy 3D, w której każdy element ma siatkę, być może różne animacje i tak dalej. W tym konkretnym przykładzie wydaje się, że możesz argumentować za obiema metodami, czy się mylę?
Dziedziczenie wyglądałoby mniej więcej tak (z odpowiednim konstruktorem itp.)
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
co z pewnością jest zgodne z zasadą „jest”, podczas gdy kompozycja wyglądałaby mniej więcej tak
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
}
Czy to bardziej kwestia osobistych preferencji, czy jedno podejście jest zdecydowanie mądrzejszym wyborem niż inne tutaj?
EDYCJA: Myślę, że nauczyłem się czegoś z każdej odpowiedzi, więc źle się czuję, wybierając tylko jedną. Moje ostateczne rozwiązanie zaczerpnie inspirację z kilku postów tutaj (wciąż nad tym pracuję). Dziękujemy wszystkim, którzy poświęcili czas na odpowiedź.
var Pawn = new Piece(howIMove, howITake, whatILookLike)
wydaje mi się znacznie prostsze, łatwiejsze w zarządzaniu i łatwiejsze w utrzymaniu niż hierarchia dziedziczenia.