"A herança diz o que um objeto É, a composição diz o que um objeto TEM."
📜 A Perspectiva Histórica
No início da POO, a Herança era vista como a "bala de prata" para o reuso de código. Se você precisasse de um "Carro" e já tivesse um "Veículo", bastava herdar. Com o tempo, os sistemas ficaram rígidos e frágeis (o "problema da banana e do gorila": você queria a banana, mas vinha o gorila e a floresta inteira junto). A Composição surgiu como uma alternativa mais flexível para montar sistemas como peças de LEGO.
💡 O Conceito
- Herança (É um): Cria uma hierarquia rígida. É útil quando existe uma relação natural e imutável de especialização.
- Composição (Tem um): Cria uma relação de dependência. Você monta o objeto injetando outros objetos dentro dele. É a base para o código modular e testável.
O segredo do bom arquiteto é: "Prefira composição em vez de herança" (Design Patterns GoF).
🛠️ No Mundo Real (Agnóstico)
Imagine um Smartphone:
- Herança: O Smartphone É UM Dispositivo Eletrônico. Ele herda características básicas como "voltagem" e "botão power".
- Composição: O Smartphone TEM UMA Câmera, TEM UM GPS e TEM UMA Bateria.
- Por que compor? Se a tecnologia da câmera mudar de "Digital" para "Lidar", você só troca a peça. Se você usasse herança para tudo, teria que mudar a árvore genealógica inteira do telefone.
💻 Implementação em C# (Nossa Ferramenta)
Veja como a Composição evita que as classes fiquem "inchadas" e presas a uma hierarquia.
// --- HERANÇA ---
public class Veiculo {
public string Marca { get; set; }
public void Ligar() => Console.WriteLine("Ligado!");
}
public class Carro : Veiculo { // Carro É UM Veículo
public int Portas { get; set; }
}
// --- COMPOSIÇÃO ---
public interface IMotor {
void Iniciar();
}
public class MotorGasolina : IMotor {
public void Iniciar() => Console.WriteLine("Vrum vrum (Gasolina)");
}
public class CarroModerno : Veiculo {
// O carro TEM UM motor (Injetado via composição)
private readonly IMotor _motor;
public CarroModerno(IMotor motor) {
_motor = motor;
}
public void Acelerar() => _motor.Iniciar();
}
🎯 Desafio de Mentalidade
Ao olhar para o código nesta pasta, pergunte-se:
- Eu usei Herança apenas para economizar de digitar código? (Se sim, cuidado: isso é um erro comum).
- Se eu precisar trocar um comportamento desta classe no futuro, eu consigo fazer isso sem alterar a classe pai?
- "Um Quadrado é um Retângulo?" (O famoso Círculo de Liskov). Se a resposta for "mais ou menos", use Composição.
Top comments (0)