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

Une classe abstraite et une interface sont des types spécifiques d’objets informatiques qui permettent à un programmeur de définir vaguement un type d’objet comme s’il s’agissait d’un autre type, tout en conservant toutes les propriétés d’origine de l’objet. Alors que plusieurs langages informatiques différents utilisent l’un ou l’autre de ces concepts, Java® est le plus connu. Les classes abstraites et les interfaces ont une variété de similitudes, mais intègrent également des différences significatives dans la structure, la syntaxe et l’utilisation.

Le typage d’objet flexible fonctionne presque exactement de la même manière pour une classe abstraite et une interface. Si une classe abstraite Example existe et qu’une classe Example2 est dérivée de cette classe, une instance de la classe Example2 peut être utilisée comme instance de Example ou Example2, selon le contexte pertinent. Par le même mécanisme, si une classe Example3 hérite d’une interface appelée Example4, une instance de Example3 peut être utilisée comme instance de Example3 ou Example4, si nécessaire. Dans ces deux cas, les classes qui font des choses distinctes mais qui ont des similitudes peuvent être utilisées comme si elles étaient toutes du même type.

Une classe abstraite et une interface peuvent toutes deux être utilisées en héritage, où une ou plusieurs classes sont dérivées d’une classe de base. Malgré cette similitude, le mécanisme dans lequel ils sont utilisés est quelque peu différent. Les classes abstraites peuvent fonctionner à la fois comme des classes de base ou des classes dérivées, tandis que les interfaces ne peuvent fonctionner que comme des classes de base. Ni une classe abstraite ni une interface ne peuvent être instanciées par elles-mêmes ; seules les classes qui en sont dérivées peuvent être instanciées, ce qui signifie qu’une instance d’un objet est créée. Bien qu’elles puissent fonctionner de la même manière que les classes de base en héritage, les interfaces ne sont pas des classes, car elles ne peuvent contenir que des prototypes de fonctions et des constantes.

Les interfaces sont beaucoup plus flexibles que les classes abstraites, car une classe peut hériter d’une seule classe de base, mais de n’importe quel nombre d’interfaces. Une classe abstraite et une interface peuvent être combinées par héritage ; les classes abstraites, comme les classes concrètes, peuvent hériter de plusieurs interfaces. L’héritage de classe abstraite en Java® applique la règle de ce langage interdisant l’héritage multiple, puisqu’une classe concrète ne peut pas hériter directement d’une ou plusieurs classes abstraites. L’héritage d’interface, d’autre part, permet à Java® d’émuler l’héritage multiple en incorporant des fonctions et des données de plusieurs interfaces dans une seule classe.

Une classe abstraite et une interface sont quelque peu limitées en elles-mêmes, mais lorsqu’elles sont combinées avec d’autres objets, ou en particulier lorsqu’elles sont utilisées dans l’héritage, elles permettent une gestion de type extrêmement flexible. Un modèle d’héritage spécial appelé polymorphisme peut utiliser l’une ou l’autre de ces constructions de langage. L’utilisation de ces constructions ne protège pas nécessairement un programmeur d’une mauvaise structure d’héritage ; elles doivent être utilisées avec autant de prudence que les classes concrètes.