Substituir Herança por Delegação.
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).
Crie um campo e coloque nele um objeto da superclasse, delegue os métodos ao objeto da superclasse e elimine a herança.
##Example
##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
-
Crie um campo na subclasse para armazenar a superclasse. No estágio inicial, coloque nele o objeto atual.
-
Altere os métodos da subclasse para que usem o objeto da superclasse em vez de
this. -
Para os métodos herdados da superclasse que são chamados no código cliente, crie métodos delegadores simples na subclasse.
-
Remova a declaração de herança da subclasse.
-
Altere o código de inicialização do campo onde a antiga superclasse é armazenada, criando um novo objeto.