Herança vs Composição
Em sistemas reais, como frameworks de UI ou motores de jogo, a escolha entre herança e composição impacta diretamente a manutenibilidade e flexibilidade do código. Herança cria hierarquias rígidas que podem se tornar frágeis quando o comportamento precisa ser compartilhado entre classes não relacionadas. Composição, por outro lado, permite montar objetos como blocos de montar, facilitando reuso sem acoplamento forte. Dominar essa comparação ajuda a decidir quando usar extends ou agregar objetos manualmente.
O PROBLEMA
Implemente sistema de personagens de jogo com herança e com composição. Compare os dois.
EXEMPLO
// Herança
new Guerreiro("Thorin").atacar() → "Thorin usa espada: 50 dano"
// Composição
const heroi = criarPersonagem("Aria", [habilidadeArco]);SOBRE O CONCEITO
Herança (class Guerreiro extends Personagem) estabelece um relacionamento "é um": um guerreiro é um personagem. Isso reutiliza código, mas cria dependência vertical. O erro 'herança muito profunda' ocorre quando você encadeia 3+ níveis (Personagem > Humano > Guerreiro > Paladino), tornando a lógica espalhada e difícil de modificar sem quebrar tudo. Composição (criarPersonagem('Aria', [habilidadeArco])) monta um objeto com habilidades independentes ("tem um" estratégia). O erro 'composição sem interface comum' surge quando os objetos compostos não seguem um contrato mínimo (ex.: atacar() em cada habilidade), impossibilitando iterar ou polimorfismo. Herança é boa para hierarquias estáveis e curtas; composição é melhor para comportamentos mutáveis e reusáveis entre tipos diferentes.
RESOLUÇÃO