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.