web-dev-qa-db-fra.com

Quelle est la différence entre une classe abstraite et une interface?

Supposons que nous ayons deux méthodes M1() et M2() dans une interface. Une classe abstraite a aussi les deux mêmes méthodes abstraites. Si une classe implémente cette interface ou hérite de la classe abstraite, elle devra implémenter les deux méthodes qu'elle contient.

Donc, pour moi, il semble qu'une interface ou une classe abstraite se comporte de la même manière pour mon scénario. Alors, quelqu'un peut-il souligner la différence entre ces deux dans ce cas particulier et suggérer d'utiliser ici une classe abstraite ou une interface?

47
WpfBee

Il existe des différences techniques entre les classes abstraites et les interfaces: une classe abstraite peut contenir une implémentation de méthodes, de champs, de constructeurs, etc., tandis qu'une interface ne contient que des prototypes de méthodes et de propriétés. Une classe peut implémenter plusieurs interfaces, mais elle ne peut hériter que d'une classe (abstraite ou autre).

Cependant, à mon avis, la différence la plus importante entre les interfaces et les classes abstraites est la différence sémantique.

Une interface définit ce que quelque chose peut faire (comment elle se comporte), et une classe abstraite définit ce que quelque chose est.

Prenons par exemple IEnumerable, la signification sémantique derrière cela est que tout ce qui implémente IEnumerable est énumérable, cela ne signifie pas que c'est une énumération, mais qu'il peut se comporter comme tel (peut être énuméré ).

Comparez cela avec un exemple de machine à laver, tout ce qui en hérite est un type de machine à laver. Tout ce qui en hérite serait un type de machine à laver, un chargeur vertical, un chargeur latéral, etc.

Au lieu de cela, si vous aviez une interface appelée ICanWash, celle-ci pourrait contenir une méthode appelée Wash. Plusieurs choses peuvent être implémentées ICanWash, qu’il s’agisse d’un Person, d’une classe de machine à laver abstraite, etc., là où l’implémentation réelle n’a pas d’importance; peut laver des choses.

En résumé, les classes définissent ce que quelque chose est, les interfaces définissent ce que quelque chose peut faire.

123
Matthew

De MSDN :

En utilisant des interfaces, vous pouvez, par exemple, inclure un comportement provenant de plusieurs sources dans une classe. Cette capacité est importante en C # car le langage ne prend pas en charge l'héritage multiple de classes

Donc, utilisez interface si vous voulez que n'importe quelle classe puisse hériter de ces méthodes.

Depuis la même page MSDN:

De plus, vous devez utiliser une interface si vous souhaitez simuler l'héritage de structures, car elles ne peuvent pas hériter d'une autre structure ou classe.

3
Fabio

Interface permet à une classe d'hériter/d'implémenter plusieurs interfaces, alors qu'en C #, vous ne pouvez hériter que d'une seule classe.

Héritage multiple, fondamentalement.

1
CharlesW

La classe abstraite contient non seulement des méthodes abstraites, mais peut également contenir d'autres champs et méthodes implémentés. En c #, vous ne pouvez pas hériter de classes multi-modules, mais vous pouvez implémenter des interfaces multi-modules. La réponse courte est donc: utilisez autant que possible des interfaces et non des classes abstraites. Dans votre exemple, il est possible d'utiliser une interface.

1
omer schleifer

Deux réflexions rapides sur les différences entre les interfaces et les classes abstraites:

  1. Classes abstraites souhaitées si une expansion future est probable, car une classe abstraite peut être développée, mais une interface devrait être améliorée par l'ajout d'une autre interface, I2.
  2. Un seul héritage (implémentation) signifie que les classes abstraites sont choisies de manière à refléter au plus près la vraie nature de base. Les interfaces peuvent facilement être ajoutées à une implémentation, mais une classe abstraite ne peut être ajoutée que s'il n'y en a pas déjà une.
1
Pieter Geerkens