Partager via


Conception d'interfaces

Remarque

Ce contenu est réimprimé avec l’autorisation de Pearson Education, Inc. à partir des Instructions de conception d’une infrastructure : conventions, idiomes et modèles des bibliothèques réutilisables .NET, 2ème édition. Cette édition a été publiée en 2008, et le livre a été entièrement révisé dans la troisième édition. Certaines informations de cette page peuvent être obsolètes.

Bien que la plupart des API se modélisent mieux à l’aide de classes et de structs, il existe des cas où les interfaces sont plus appropriées ou constituent la seule option.

Le CLR ne prend pas en charge plusieurs héritages (c’est-à-dire que les classes CLR ne peuvent pas hériter de plusieurs classes de base), mais il permet aux types d’implémenter une ou plusieurs interfaces en plus d’hériter d’une classe de base. Par conséquent, les interfaces sont souvent utilisées pour obtenir l’effet d’un héritage multiple. Par exemple, IDisposable est une interface qui permet aux types de prendre en charge l’élimination indépendamment de toute autre hiérarchie d’héritage à laquelle ils veulent participer.

L’autre situation dans laquelle la définition d’une interface est appropriée consiste à créer une interface commune pouvant être prise en charge par plusieurs types, y compris certains types valeur. Les types valeur ne peuvent pas hériter de types autres que ValueType, mais ils peuvent implémenter des interfaces. L’utilisation d’une interface est donc la seule option permettant de fournir un type de base commun.

✔️ DÉFINISSEZ une interface si vous avez besoin qu’une API commune soit prise en charge par un ensemble de types qui inclut des types valeur.

✔️ ENVISAGEZ de définir une interface si vous avez besoin de prendre en charge ses fonctionnalités sur des types qui héritent déjà d’un autre type.

❌ ÉVITEZ d’utiliser des interfaces de marqueur (interfaces sans aucun membre).

En général, si vous avez besoin de marquer une classe comme ayant une caractéristique spécifique (marqueur), utilisez un attribut personnalisé plutôt qu’une interface.

✔️ FOURNISSEZ au moins un type qui est une implémentation d’une interface.

Cela permet de valider la conception de l’interface. Par exemple, List<T> est une implémentation de l’interface IList<T>.

✔️ FOURNISSEZ au moins une API qui consomme chaque interface que vous définissez (une méthode prenant l’interface en tant que paramètre ou une propriété typée en tant qu’interface).

Cela permet de valider la conception de l’interface. Par exemple, List<T>.Sort consomme l’interface System.Collections.Generic.IComparer<T>.

❌ N’AJOUTEZ PAS de membres à une interface qui a déjà été expédiée.

Cela aurait comme effet d’interrompre les implémentations de l’interface. Vous devez créer une interface afin d’éviter les problèmes de versioning.

À l’exception des situations décrites dans ces instructions, vous devez, en général, choisir des classes plutôt que des interfaces quand vous concevez des bibliothèques réutilisables de code managé.

Portions © 2005, 2009 Microsoft Corporation. Tous droits réservés.

Réimprimé avec l’autorisation de Pearson Education, Inc. et extrait de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition par Krzysztof Cwalina et Brad Abrams, publié le 22 octobre 2008 par Addison-Wesley Professional dans le cadre de la série sur le développement Microsoft Windows.

Voir aussi