Quand utiliser la délégation au lieu de l’inheritance?

Quelqu’un pourrait-il expliquer s’il est préférable d’utiliser la délégation plutôt que l’inheritance?

Lorsque vous souhaitez “copier” / exposer l’API de la classe de base, vous utilisez l’inheritance. Lorsque vous souhaitez uniquement “copier” une fonctionnalité, utilisez la délégation.

Un exemple de ceci: vous voulez créer une stack en dehors d’une liste. Stack n’a que pop, push et peek. Vous ne devriez pas utiliser l’inheritance étant donné que vous ne voulez pas les fonctionnalités push_back, push_front, removeAt et autres dans une stack.

Ils n’ont rien à faire ensemble. La délégation est un comportement. L’inheritance est une technique modèle.

L’inheritance est pour la modélisation “is-a”. Un ordinateur “is-a” un système électronique.

La délégation est la manière dont les méthodes fournissent des résultats. Parfois, un object déléguera le travail à un autre object. La délégation peut se faire via n’importe quelle relation – vous pouvez déléguer à une superclasse, à un membre d’un composite ou d’un agrégat ou à une relation.

Vous pouvez utiliser la délégation à plusieurs instances de classe internes pour simplifier leurs fonctionnalités dans un regroupement commun. Si votre langue n’implémente pas l’inheritance multiple par exemple, vous pouvez hériter de l’une des bases et encapsuler l’autre, en déléguant la fonctionnalité que vous souhaitez exposer à l’implémentation sous-jacente. L’inheritance lie également votre classe à la hiérarchie des classes dont vous héritez, comme avec la délégation, vous pouvez conserver votre place dans votre propre hiérarchie et déléguer des appels à une autre.

Supposons que votre classe s’appelle B et que le dérivé / délégué à la classe s’appelle A

Voici quelques exemples d’utilisation d’inheritance ou de délégation:
Si

  • vous voulez exprimer une relation (is-a) alors vous voulez utiliser l’inheritance.
  • vous voulez pouvoir passer votre classe à une API existante en attente de A, vous devez alors utiliser l’inheritance.
  • vous voulez améliorer A, mais A est final et ne peut plus être sous-classé, alors vous devez utiliser la composition et la délégation.

À mon avis, la délégation peut être appelée quand il est temps d’utiliser et l’inheritance est jamais intégré.

Prenons l’exemple de la gem in_threads . Elle utilise le délégateur InThreads pour implémenter les threads de tout module Ruby Enumerable. Avec cela, appelez uniquement les méthodes in_threads sur un tableau, il s’exécutera dans les threads.

Je suis d’accord avec @Anzurio. Juste pour l’expliquer en termes simples:

Utilisez l’inheritance uniquement lorsque vous pensez que la nouvelle classe est une extension naturelle de la classe existante. Préférez utiliser la composition / la délégation à d’autres fins, par exemple en utilisant une méthode spécifique, etc.