web-dev-qa-db-fra.com

Interfaces vs classes abstraites

En C #, quand utiliser les interfaces et quand utiliser les classes abstraites? Quel peut être le facteur décisif?

118
tush1r

Les avantages d'une classe abstraite sont:

  • Possibilité de spécifier les implémentations par défaut des méthodes
  • Ajout de la vérification invariante aux fonctions
  • Avoir un peu plus de contrôle sur la manière dont les méthodes "interface" sont appelées
  • Capacité à fournir un comportement lié ou non à l'interface pour "libre"

Les interfaces ne sont que des contrats de transmission de données et ne possèdent pas ces fonctionnalités. Cependant, ils sont généralement plus souples car un type ne peut être dérivé que d'une classe, mais peut implémenter un nombre quelconque d'interfaces.

132
JaredPar

Les classes abstraites et les interfaces sont sémantiquement différentes, bien que leur utilisation puisse se chevaucher.

Une classe abstraite est généralement utilisée comme base de construction pour des classes similaires. L'implémentation commune aux classes peut être dans la classe abstraite.

Une interface est généralement utilisée pour spécifier une capacité pour les classes, où les classes ne doivent pas être très similaires.

78
Guffa

Une autre chose à considérer est que, puisqu'il n'y a pas d'héritage multiple, si vous voulez qu'une classe puisse implémenter/hériter de votre classe d'interface/abstract, mais hériter d'une autre classe de base, utilisez une interface.

8
Zifre

La vraie question est de savoir s'il faut utiliser des interfaces ou des classes de base. Cela a été couvert avant.

En C #, une classe abstraite (celle qui porte le mot-clé "abstract") est simplement une classe à partir de laquelle vous ne pouvez pas instancier des objets. Cela sert un objectif différent de simplement faire la distinction entre les classes de base et les interfaces.

5
Dave Van den Eynde