abstractclass et interface sont deux mécanismes du langage Java qui prennent en charge les définitions de classes abstraites. C'est précisément grâce à l'existence de ces deux mécanismes que Java dispose de puissantes capacités orientées objet. Il existe de grandes similitudes entre la classe abstraite et l'interface en termes de prise en charge de la définition de classe abstraite, et elles peuvent même être remplacées les unes par les autres. Par conséquent, de nombreux développeurs semblent être plus décontractés quant au choix de la classe abstraite et de l'interface lors de la définition des classes abstraites. En fait, il existe encore une grande différence entre les deux. Leur choix reflète même la compréhension de la nature du domaine problématique et la question de savoir si la compréhension de l'intention de conception est correcte et raisonnable. Cet article analysera les différences entre eux et tentera de fournir aux développeurs une base pour choisir entre les deux.
Comprendre les classes abstraites
Abstractclass et interface sont tous deux utilisés pour créer des classes abstraites dans le langage Java (la classe abstraite dans cet article n'est pas traduite de abstractclass, elle représente un corps abstrait et abstractclass est une méthode utilisée pour définir des classes abstraites dans le langage Java), lecteurs veuillez faire attention à distinguer) la définition, alors qu'est-ce qu'une classe abstraite et quels avantages l'utilisation de classes abstraites peut-elle nous apporter ?
Dans le concept orienté objet, nous savons que tous les objets sont représentés par des classes, mais l’inverse n’est pas vrai. Toutes les classes ne sont pas utilisées pour décrire des objets. Si une classe ne contient pas suffisamment d'informations pour décrire un objet spécifique, une telle classe est une classe abstraite. Les classes abstraites sont souvent utilisées pour représenter des concepts abstraits que nous dérivons de l'analyse et de la conception de domaines problématiques. Ce sont des abstractions d'une série de concepts spécifiques qui semblent différents mais qui sont essentiellement les mêmes. Par exemple : si nous développons un logiciel d'édition graphique, nous constaterons qu'il existe des concepts spécifiques tels que les cercles et les triangles dans le domaine problématique. Ils sont différents, mais ils appartiennent tous au concept de forme. Le concept de forme est différent. dans le domaine problématique. S’il existe, c’est un concept abstrait. C'est précisément parce que les concepts abstraits n'ont pas de concepts concrets correspondants dans le domaine du problème, de sorte que les classes abstraites utilisées pour représenter les concepts abstraits ne peuvent pas être instanciées.
Dans le domaine orienté objet, les classes abstraites sont principalement utilisées pour masquer les types. Nous pouvons construire une description abstraite d’un ensemble fixe de comportements, mais cet ensemble de comportements peut avoir un certain nombre d’implémentations concrètes possibles. Cette description abstraite est la classe abstraite, et cet ensemble de toutes les implémentations concrètes possibles est représenté par toutes les classes dérivées possibles. Les modules peuvent fonctionner sur un corps abstrait. Parce qu'un module repose sur une abstraction fixe, il ne peut pas être modifié en même temps, le comportement de ce module peut également être étendu en dérivant de cette abstraction. Les lecteurs familiers avec OCP doivent savoir que pour réaliser OCP (Open-ClosedPrinciple), l'un des principes fondamentaux de la conception orientée objet, les classes abstraites sont la clé.
En regardant la classe abstraite et l'interface du niveau de définition grammaticale
Au niveau grammatical, le langage Java fournit différentes définitions pour la classe abstraite et l'interface. Voici un exemple de définition d'une classe abstraite nommée Demo pour illustrer cette différence.
La façon de définir la classe abstraite Demo à l’aide de abstractclass est la suivante :
D'un point de vue programmation, la classe abstraite et l'interface peuvent être utilisées pour mettre en œuvre l'idée de « conception par contrat ». Cependant, il existe encore quelques différences dans les utilisations spécifiques.
Tout d'abord, abstractclass représente une relation d'héritage dans le langage Java, et une classe ne peut utiliser la relation d'héritage qu'une seule fois. Cependant, une classe peut implémenter plusieurs interfaces. Il s'agit peut-être d'un compromis pris en compte par les concepteurs du langage Java lorsqu'ils envisagent la prise en charge par Java de l'héritage multiple.
Deuxièmement, dans la définition de abstractclass, nous pouvons attribuer le comportement par défaut de la méthode. Mais dans la définition de l'interface, les méthodes ne peuvent pas avoir de comportement par défaut. Afin de contourner cette restriction, des délégués doivent être utilisés, mais cela ajoutera une certaine complexité et causera parfois beaucoup de problèmes.
Il existe un autre problème sérieux lié à l'impossibilité de définir un comportement par défaut dans une classe abstraite, à savoir que cela peut entraîner des problèmes de maintenance. Parce que si vous souhaitez ultérieurement modifier l'interface de la classe (généralement représentée par abstractclass ou interface) pour l'adapter à de nouvelles situations (par exemple, ajouter de nouvelles méthodes ou ajouter de nouveaux paramètres aux méthodes existantes), ce sera très gênant, et cela peut Cela prend beaucoup de temps (surtout lorsqu'il existe de nombreuses classes dérivées). Mais si l'interface est implémentée via abstractclass, il vous suffira peut-être de modifier le comportement par défaut défini dans abstractclass.
De même, si le comportement par défaut ne peut pas être défini dans une classe abstraite, la même implémentation de méthode apparaîtra dans chaque classe dérivée de la classe abstraite, violant le principe « une règle, un endroit », entraînant une duplication de code, ce qui n'est pas non plus propice. à l'entretien futur. Par conséquent, soyez très prudent lorsque vous choisissez entre une classe abstraite et une interface.
Examiner la classe abstraite et l'interface du point de vue des concepts de conception. Ce qui précède traite principalement des différences entre la classe abstraite et l'interface du point de vue de la définition grammaticale et de la programmation. Les différences à ces niveaux sont relativement faibles et non essentielles. Cette section analysera la différence entre abstractclass et interface à un autre niveau : les concepts de conception reflétés par les deux. L'auteur estime que