Una búsqueda rápida de este intercambio de pila muestra que, en general, la composición generalmente se considera más flexible que la herencia, pero como siempre depende del proyecto, etc., y hay ocasiones en que la herencia es la mejor opción. Quiero hacer un juego de ajedrez en 3D donde cada pieza tenga una malla, posiblemente animaciones diferentes, etc. En este ejemplo concreto, parece que podría argumentar un caso para ambos enfoques, ¿estoy equivocado?
La herencia se vería así (con el constructor adecuado, etc.)
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
que ciertamente obedece al principio "es-a" mientras que la composición se vería así
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
}
¿Es más una cuestión de preferencia personal o es un enfoque claramente una opción más inteligente que el otro aquí?
EDITAR: Creo que aprendí algo de cada respuesta, así que me siento mal por elegir solo una. Mi solución final se inspirará en varias de las publicaciones aquí (aún trabajando en ello). Gracias a todos los que se tomaron el tiempo para responder.
var Pawn = new Piece(howIMove, howITake, whatILookLike)
me parece mucho más simple, más manejable y más fácil de mantener que una jerarquía de herencia.