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?
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.
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.
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.
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.
Deux réflexions rapides sur les différences entre les interfaces et les classes abstraites: