web-dev-qa-db-fra.com

Quand utiliser la délégation au lieu d'héritage?

Quelqu'un pourrait-il s'il vous plaît expliquer quand je voudrais utiliser la délégation au lieu d'héritage?

46
Cuga

Ils n'ont rien à faire ensemble. La délégation est un comportement. L'héritage est une technique de modèle.

L'héritage est pour la modélisation "IS-A". Un système électronique d'ordinateur "est-a".

La délégation est la manière dont les méthodes fournissent des résultats. Parfois, un objet déléguera du travail à un autre objet. La délégation peut être via toute relation - vous pouvez déléguer à une superclasse, à un membre d'un composite ou d'agrégat, ou de toute relation.

27
S.Lott

Vous pouvez utiliser la délégation vers plusieurs instances de classe internes pour simplifier leur fonctionnalité dans un groupe commun. Si votre langue n'implique pas de multiples héritage par exemple, vous pouvez hériter d'une des bases et d'envelopper l'autre, déléguant les fonctionnalités que vous souhaitez exposer à la mise en œuvre sous-jacente. L'héritage lie également votre classe dans la hiérarchie des classes que vous hérissez d'où, comme pour la délégation, vous pouvez garder votre place dans votre propre hiérarchie et déléguer des appels à un autre.

4
Adam Markowitz

Supposons que votre classe est appelée b et le dérivé/délégué à la classe est appelé A alors

Voici quelques exemples lorsque l'héritage ou la délégation sont utilisées:
Si

  • vous souhaitez exprimer une relation (IS-A), alors vous souhaitez utiliser l'héritage.
  • vous voulez être capable de transmettre votre classe à une API existante en attendant que A a alors besoin d'utiliser l'héritage.
  • vous souhaitez améliorer A, mais A est définitif et que vous ne pouvez plus être sous-classé, alors vous devez utiliser la composition et la délégation.
3
lothar

À mon avis, la délégation peut être appelée quand il est temps d'utiliser et que l'héritage est ancrée.

Prise le gemme in_threads Par exemple, il utilise IntHreads Déléguateur pour mettre en œuvre les threads de tout moduleRuby. Avec cela, appelez uniquement les méthodes in_threads sur un tableau, il fonctionnera dans des threads.

1
Aston