Sobes.tech
Junior

Quais são as diferenças entre herança e composição na programação orientada a objetos?

sobes.tech IA

Resposta da IA

Herança:

  • Relação "é um" (is-a).
  • A classe filha herda os campos e métodos da classe pai.
  • Usado para criar versões especializadas de classes existentes.
  • Pode levar a hierarquias rígidas e problemas com herança múltipla.

Composição:

  • Relação "tem" (has-a).
  • A classe contém instâncias de outras classes como seus campos.
  • Delegar a execução de tarefas aos objetos contidos.
  • Oferece flexibilidade e a possibilidade de substituir componentes.

Exemplo em Java:

// Herança
class Vehicle { // Classe base
    void start() { /* ... */ }
}

class Car extends Vehicle { // Herda de Vehicle
    // Métodos específicos de Car
}

// Composição
class Engine { // Componente constitutivo
    void start() { /* ... */ }
}

class AnotherCar { // Classe que usa composição
    private Engine engine; // Contém uma instância de Engine

    AnotherCar(Engine engine) {
        this.engine = engine;
    }

    void start() {
        engine.start(); // Delegação
    }
}

As diferenças podem ser apresentadas na forma de tabela:

Critério Herança Composição
Relação "é um" (is-a) "tem" (has-a)
Rigidificação Mais rígido Mais flexível
Reutilização Através de hierarquias de classes Através de instâncias de objetos
Mudança de comportamento Sobrescrever métodos Substituir objetos contidos
Aplicação Especialização, extensão de funcionalidade Agregação, construção a partir de partes

A composição é geralmente preferida à herança na maioria dos casos para alcançar maior flexibilidade e menor dependência entre classes.