ConstructiCat Logo
CodeBust.
Browse section ▾

Substituir Herança por Delegação.

Problem

Você tem uma subclasse que usa apenas uma parte dos métodos de sua superclasse (ou não é possível herdar os dados da superclasse).

Solution

Crie um campo e coloque nele um objeto da superclasse, delegue os métodos ao objeto da superclasse e elimine a herança.

##Example

Antes
Vector isEmpty() Stack
Depois
Stack vectorisEmpty() Vector isEmpty() return this.vector.isEmpty(); 1

##Why Refactor

Substituir a herança por composição pode melhorar substancialmente o design da classe se:

  • Sua subclasse viola o princípio de substituição de Liskov, ou seja, se a herança foi implementada apenas para combinar código comum, e não porque a subclasse é uma extensão da superclasse.

  • A subclasse usa apenas uma parte dos métodos da superclasse. Nesse caso, é só questão de tempo até que alguém chame um método da superclasse que não deveria ser chamado.

Em essência, essa técnica de refatoração separa as duas classes e torna a superclasse a auxiliar da subclasse, e não sua progenitora. Em vez de herdar todos os métodos da superclasse, a subclasse terá apenas os métodos necessários para delegar aos métodos do objeto da superclasse.

##Benefits

  • Uma classe não contém nenhum método desnecessário herdado da superclasse.

  • Vários objetos com diversas implementações podem ser colocados no campo de delegação. Na prática, você obtém o padrão de projeto Strategy.

##How to Refactor

  1. Crie um campo na subclasse para armazenar a superclasse. No estágio inicial, coloque nele o objeto atual.

  2. Altere os métodos da subclasse para que usem o objeto da superclasse em vez de this.

  3. Para os métodos herdados da superclasse que são chamados no código cliente, crie métodos delegadores simples na subclasse.

  4. Remova a declaração de herança da subclasse.

  5. Altere o código de inicialização do campo onde a antiga superclasse é armazenada, criando um novo objeto.