45 votes

Méthodes d'extension versus héritage

Existe-t-il des règles empiriques qui aident à déterminer lequel utiliser dans quel cas? Devrais-je en préférer un à l'autre la plupart du temps?

Merci!

34voto

womp Points 71924

Les méthodes d'Extension sont utiles, mais ils sont plus difficiles à découvrir par le biais de l'IDE que les méthodes ordinaires, car ils ne sont pas attachés à la classe d'origine et il n'y a pas d'indices quant à l'endroit où le code peut résider. Il y a quelques meilleures pratiques des suggestions quant à l'endroit où les mettre et comment les nommer, mais ce ne sont que des lignes directrices et il n'ya aucune garantie que quelqu'un va les suivre.

Habituellement, vous devez utiliser des méthodes d'extension si vous ajoutez uniquement les fonctionnalités bien connues, bien utilisé de la classe ou de l'interface comme les .Net les classes de base, que vous n'avez pas accès au code. Les méthodes d'Extension ont également la contrainte, non seulement que vous devez avoir l'original de l'assemblée, vous devez avoir de l'assemblée avec les méthodes d'extension, un fait qui doit être compris par les consommateurs de votre code.

L'utilisation de l'héritage vous permettra d'ajouter, de supprimer ou de remplacer une fonctionnalité, et s'assurer qu'il est toujours présent avec la classe lors de la construire.

14voto

Joseph Points 18099

Les méthodes d'extension doivent être utilisées lorsque vous souhaitez fournir une implémentation à travers une variété de types qui doivent partager le même comportement, mais seraient autrement différentes. C'est pourquoi vous voyez souvent les méthodes d'extension utilisées sur les interfaces, car c'est un outil très puissant qui garantit que toute implémentation donnée d'une interface aura la même implémentation d'un comportement donné.

Par exemple, les méthodes d'extension Skip et Take.

9voto

Randolpho Points 36512

Eh bien... vous ne pouvez pas toujours utiliser l'héritage. String, par exemple, est une classe scellée. C'est dans les cas où une méthode d'extension brille vraiment.

En général, les méthodes d'extension sont les meilleurs pour les petits utilitaires que vous pourriez mettre dans une classe statique, mais qui fonctionnent par rapport à une instance d'un type particulier. Les chaînes sont un bon exemple-presque tout le monde possède sa propre petite chaîne de méthodes d'extension pour faire un peu opérations sur les chaînes.

Un autre grand endroit pour des méthodes d'extension est contre les énumérations. J'ai presque toujours un HasFlag méthode d'extension à l'encontre de tout [Flags] énumérations j'ai créer.

8voto

Steven Sudit Points 13793

Chaque fois que possible, utiliser l'héritage , au lieu des méthodes d'extension.

modifier

Je préfère garder ce court et simple, mais je vais bien sûr répondre à des questions de suivi.

Dans le cas où l'héritage est possible, c'est à dire les classes qui ne sont pas scellés, il est presque toujours une meilleure option que les méthodes d'extension. En fait, c'est ce que le document sur les pratiques exemplaires qui womp référencé dit. Il a des rubriques telles que "méfiez-vous des méthodes d'extension", de "Réfléchir à deux fois avant de l'extension des types qui ne vous appartient pas", et "Préfèrent l'interface extensions au fil extensions de la classe". En d'autres termes, il dit juste ce que mon one-liner fait, avec plus de détails.

L'article ne donner des raisons, mais la ligne de fond est que c'est la façon dont les méthodes d'extension ont été conçus pour être utilisés. Ils ont été ajoutés à la langue en retard dans le jeu, un peu de sucre syntaxique pour permettre aux états membres de caler LINQ, sans avoir à revenir en arrière et de réinventer la roue. C'est l'exemple canonique de ce qu'ils sont bons pour. Un autre bon exemple est l'ajout de l'utilitaire méthodes, telles que:

public static string FormatWith(this string format, params object[] args)
{ return string.Format(CultureInfo.InvariantCulture, format, args); }

Notez que, dans ce cas, les méthodes d'extension ont été le seul moyen pour accomplir cette fonctionnalité supplémentaire, car les chaînes sont scellés.

Comme pour la composition au cours de l'héritage, alors que c'est un truisme, je ne vois pas la pertinence ici. Si nous utilisons les méthodes d'extension ou d'héritage, le but est de modifier l'interface pour permettre à une autre méthode. Comment cette méthode est mise en œuvre, que ce soit par la composition, les génériques ou d'une autre technique, est orthogonale.

2voto

ArsenMkrt Points 24447

Ils sont très différents, par exemple des opérateurs de requête standard LINQ sont excellent exemple de méthodes d'extension qui devrait être difficile à mettre en œuvre avec l'héritage, mais si vous avez accès à la classe et peut modifier la source, il sera préférable d'utiliser l'héritage,
MODIFIER
et voici quelques règles que je trouve ici C# 3.0: les Méthodes d'Extension

  • Les méthodes d'Extension ne peuvent pas être utilisés pour remplacer les méthodes existantes
  • Une extension de la méthode avec le même nom et la même signature qu'une méthode d'instance ne sera pas appelé
  • Le concept de méthodes d'extension ne peuvent pas être appliquées à des domaines, propriétés ou événements
  • Utiliser des méthodes d'extension avec parcimonie....l'abus peut être une mauvaise chose!

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