Remplacer l'héritage par la délégation.
Vous avez une sous-classe qui n'utilise qu'une partie des méthodes de sa superclasse (ou il est impossible d'hériter des données de la superclasse).
Créez un champ, placez-y un objet de la superclasse, déléguez les méthodes à cet objet et supprimez l'héritage.
##Example
##Why Refactor
Remplacer l'héritage par la composition peut améliorer considérablement la conception des classes si :
-
Votre sous-classe enfreint le principe de substitution de Liskov, c'est-à-dire si l'héritage n'a été mis en place que pour mutualiser du code commun, et non parce que la sous-classe est une extension de la superclasse.
-
La sous-classe n'utilise qu'une partie des méthodes de la superclasse. Dans ce cas, ce n'est qu'une question de temps avant que quelqu'un appelle une méthode de la superclasse qu'il n'était pas censé appeler.
En substance, cette technique de refactorisation sépare les deux classes et fait de la superclasse l'assistante de la sous-classe, et non son parent. Au lieu d'hériter de toutes les méthodes de la superclasse, la sous-classe ne possédera que les méthodes nécessaires pour déléguer aux méthodes de l'objet de la superclasse.
##Benefits
-
Une classe ne contient aucune méthode inutile héritée de la superclasse.
-
Divers objets aux implémentations variées peuvent être placés dans le champ de délégation. Vous obtenez en fait le patron de conception Stratégie.
##How to Refactor
-
Créez dans la sous-classe un champ destiné à contenir la superclasse. Dans un premier temps, placez-y l'objet courant.
-
Modifiez les méthodes de la sous-classe pour qu'elles utilisent l'objet de la superclasse au lieu de
this. -
Pour les méthodes héritées de la superclasse qui sont appelées dans le code client, créez de simples méthodes de délégation dans la sous-classe.
-
Supprimez la déclaration d'héritage de la sous-classe.
-
Modifiez le code d'initialisation du champ qui stocke l'ancienne superclasse en créant un nouvel objet.