Classe abstraite et interface
Une classe (ou un type) abstraite est un type d’un système de type nominatif déclaré par le programme. Bien que son nom l’indique, une classe abstraite peut ou non inclure des méthodes ou des propriétés abstraites. La distinction classe fait référence aux différentes constructions du langage qui peuvent être utilisées pour mettre en œuvre des types abstraits. Les classes abstraites peuvent être caractérisées par un problème de conception qui s’inscrit dans le cadre de la meilleure programmation orientée objet et par leur caractère inachevé.
Une interface est un type abstrait que les classes doivent implémenter pour spécifier une interface (de manière générique). Les interfaces ne peuvent contenir que des signatures de méthodes et des déclarations de constantes (statiques et finales), jamais de définitions de méthodes. Les interfaces simulent des héritages multiples et sont utilisées pour coder des similitudes partagées entre différents types de classes.
Les types abstraits peuvent être créés, signifiés ou simulés de différentes manières. Un programmeur peut signifier des types abstraits en utilisant explicitement le mot-clé abstract, en incluant une ou plusieurs méthodes dans la définition de la classe, en héritant d’un autre type abstrait sans surcharger les caractéristiques manquantes nécessaires pour compléter la définition de la classe, ou en envoyant une méthode particulière au langage de programmation orienté objet connu sous le nom de this qui n’implémente pas la méthode directement.
Les interfaces peuvent être définies à l’aide de méthodes abstraites. Les classes peuvent également être implémentées dans des interfaces. Si une classe implémente une interface et n’implémente pas toutes ses méthodes, le signifiant abstrait doit être utilisé, sinon ce signifiant n’est pas nécessaire (car toutes les interfaces sont intrinsèquement abstraites). Les classes peuvent également implémenter plusieurs interfaces.
Alors que les interfaces sont utilisées pour spécifier des interfaces génériques, les types abstraits peuvent être utilisés pour définir et appliquer un protocole (qui est un ensemble d’opérations que tous les objets qui mettent en œuvre le protocole souhaité doivent prendre en charge). Les types abstraits n’existent pas dans les langages sans sous-typage. En tant que tels, les sous-types sont contraints d’implémenter toutes les fonctionnalités nécessaires, ce qui garantit l’exactitude de l’exécution du programme. Il existe plusieurs façons de créer des types abstraits : les classes de base abstraites sont des classes qui sont explicitement déclarées abstraites ou qui contiennent des méthodes abstraites (non implémentées) ; les systèmes d’objets Common Lisp comprennent des mixins basés sur le système Flavors ; Java, bien sûr ; et Traits, qui agit comme une extension de Smalltalk.
Résumé :
1. Les classes (ou types) abstraits déclarent les programmes ; les interfaces sont des types abstraits que toutes les classes doivent implémenter afin de spécifier leur interface.
2. Les types abstraits peuvent être signifiés en utilisant le mot-clé explicitement ; les interfaces sont intrinsèquement abstraites et n’ont donc pas besoin d’être signifiées en utilisant le mot-clé (à moins qu’une classe spécifique implémente une interface mais n’implémente pas toutes ses méthodes).