DEV Community

Cover image for POO Além do Código #3: Herança e Composição (A Estrutura)
Bruno Freschi
Bruno Freschi

Posted on

POO Além do Código #3: Herança e Composição (A Estrutura)

"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();
}
Enter fullscreen mode Exit fullscreen mode

🎯 Desafio de Mentalidade

Ao olhar para o código nesta pasta, pergunte-se:

  1. Eu usei Herança apenas para economizar de digitar código? (Se sim, cuidado: isso é um erro comum).
  2. Se eu precisar trocar um comportamento desta classe no futuro, eu consigo fazer isso sem alterar a classe pai?
  3. "Um Quadrado é um Retângulo?" (O famoso Círculo de Liskov). Se a resposta for "mais ou menos", use Composição.

Top comments (0)