43 votes

Quand utiliser un modèle ou un héritage

J'ai cherché un peu partout, et la réponse courante à cette question semble être du type "ils ne sont pas liés, et l'un ne peut pas être substitué à l'autre". Mais disons que vous êtes dans un entretien et qu'on vous demande "Quand utiliseriez-vous un modèle au lieu d'un héritage et vice versa ?".

76voto

Kerrek SB Points 194696

De mon point de vue, les modèles et l'héritage sont littéralement des concepts orthogonaux : L'héritage est "vertical" et descend, de l'abstrait au plus concret. Une forme, un triangle, un triangle équilatéral.

Les modèles, en revanche, sont " horizontaux " et définissent parallèle des instances de code qui ne savent rien les unes des autres. Trier des entiers est formellement la même chose que trier des doubles et trier des chaînes de caractères, mais ce sont trois fonctions totalement différentes. Elles ont toutes "l'air" identiques de loin, mais elles n'ont rien à voir les unes avec les autres.

L'héritage fournit une abstraction au moment de l'exécution. Les modèles sont génération du code outils.

Comme les concepts sont orthogonaux, ils peuvent heureusement être utilisés ensemble pour atteindre un objectif commun. Mon exemple préféré est le suivant effacement de type Dans ce cas, le conteneur d'effacement de type contient un pointeur de base virtuel vers une classe d'implémentation, mais il existe un nombre arbitraire d'implémentations concrètes qui sont générées par une classe dérivée d'un modèle. La génération de code de gabarit sert à remplir une hiérarchie d'héritage. Magie.

21voto

Gnawme Points 1377

La "réponse commune" est fausse. Dans "Effective C++", Scott Meyers dit au point 41 :

Item 41 : comprendre les interfaces implicites et le polymorphisme à la compilation.

Meyers poursuit en résumant :

  • Les classes et les modèles prennent en charge les interfaces et le polymorphisme.
  • Pour les classes, les interfaces sont explicites et centrées sur les signatures de signatures. Le polymorphisme se produit à l'exécution par le biais de fonctions virtuelles.
  • Pour les paramètres des modèles, les interfaces sont implicites et basées sur des modèles valides. valides. Le polymorphisme se produit pendant la compilation à travers l'instanciation et la résolution de surcharge de fonctions.

4voto

justin Points 72871

Utilisez un modèle dans une base (ou une composition) lorsque vous souhaitez conserver la sécurité des types ou éviter la répartition virtuelle.

1voto

Casey Points 19286

Les modèles sont appropriés pour définir une interface qui fonctionne sur plusieurs types d'objets non liés. Les modèles sont parfaitement adaptés aux classes conteneur où il est nécessaire de généraliser les objets du conteneur, tout en conservant les informations de type.

En cas d'héritage, tous les paramètres doivent être du type de paramètre défini ou s'étendre à partir de celui-ci. Ainsi, lorsque les méthodes opèrent sur des objets qui ont correctement une relation hiérarchique directe, l'héritage est le meilleur choix.

Lorsque l'héritage est incorrectement appliqué, il faut alors créer des hiérarchies de classes trop complexes, d'objets sans rapport entre eux. La complexité du code augmentera pour un gain minime. Si c'est le cas, utilisez des modèles.

0voto

Template décrit un algorithme comme décider du résultat d'une comparaison entre deux objets d'une classe ou les trier. Le type d'objets sur lesquels on opère varie mais l'opération, la logique, l'étape, etc. est logiquement la même.

D'un autre côté, l'héritage est utilisé par la classe enfant uniquement pour étendre ou rendre plus spécifique la fonctionnalité des parents. J'espère que cela a du sens

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X