web-dev-qa-db-fra.com

Pourquoi avons-nous besoin d'interfaces en Java?

Dans Java pour implémenter l'héritage multiple, nous utilisons des interfaces. Est-ce la seule utilisation des interfaces? Si oui, quelle est l'utilisation principale de l'interface en Java? Pourquoi avons-nous besoin d'interfaces en Java?

54
Vinoth Kumar

Je dirais que l'utilisation principale est le polymorphisme, ou la possibilité d'effectuer la même opération sur un certain nombre d'objets différents. Si différents objets implémentent tous la même interface et ont la même méthode, vous pouvez stocker tous ces objets dans un vecteur, par exemple, et parcourir le vecteur en appelant cette méthode sur chacun.

46
user377136

Je pensais également à la façon dont les interfaces sont utilisées. J'espère que cela aidera les autres:

Une interface est un contrat (ou un protocole, ou une compréhension commune) de ce que les classes peuvent faire. Lorsqu'une classe implémente une certaine interface, elle promet de fournir une implémentation à toutes les méthodes abstraites déclarées dans l'interface. L'interface définit un ensemble de comportements communs. Les classes implémentant l'interface acceptent ces comportements et fournissent leur propre implémentation aux comportements. Cela vous permet de programmer à l'interface, au lieu de l'implémentation réelle. L'une des principales utilisations de l'interface est de fournir un contrat de communication entre deux objets. Si vous savez qu'une classe implémente une interface, vous savez que cette classe contient des implémentations concrètes des méthodes déclarées dans cette interface et vous êtes assuré de pouvoir invoquer ces méthodes en toute sécurité. En d'autres termes, deux objets peuvent communiquer en fonction du contrat défini dans l'interface, au lieu de leur implémentation spécifique.

Deuxièmement, Java ne prend pas en charge l'héritage multiple (contrairement à C++). L'héritage multiple vous permet de dériver une sous-classe à partir de plusieurs superclasses directes. Cela pose problème si deux superclasses directes ont des implémentations conflictuelles. (Laquelle suivre dans la sous-classe?). Cependant, l'héritage multiple a sa place. Java le fait en vous permettant "d'implémenter" plus d'une interface (mais vous ne pouvez "étendre que") "à partir d'une seule superclasse). Comme les interfaces ne contiennent que des méthodes abstraites sans implémentation réelle, aucun conflit ne peut survenir entre les multiples interfaces. (L'interface peut contenir des constantes mais n'est pas recommandée. Si une sous-classe implémente deux interfaces avec des constantes en conflit, le compilateur signalera une erreur de compilation.)

de: http://www.ntu.edu.sg/home/ehchua/programming/Java/J3b_OOPInheritancePolymorphism.html#zz-6.6

30
Megamind

En plus de ces réponses, je dirais que l'utilisation la plus importante des interfaces est de réduire le couplage entre les composants de votre logiciel.

Une interface permet de représenter un accord entre les classes sur la façon dont elles se parleront sans être liée aux implémentations réelles.

Cela nous permet de remplacer les implémentations par d'autres (très utiles pour tester ou changer les cas d'utilisation) sans changer le code compilé.

17
Peter Tillemans

Vous en avez besoin pour pouvoir taper vos objets en dehors de la hiérarchie.

Par exemple, les objets qui peuvent être comparés peuvent se trouver à peu près n'importe où sur la hiérarchie des objets - ils n'ont pas besoin d'avoir un ancêtre commun qui puisse être comparé. Strings peuvent être comparés, Integers peuvent être comparés, vous pouvez même créer vos propres Frames qui pourraient être comparés (par exemple, un cadre est "moins" qu'un autre cadre s'il est plus au premier plan - c'est-à-dire s'il superpose l'autre cadre). Ainsi, si vous voulez faire référence à une chose qui peut être comparée, vous seriez obligé de déclarer une variable avec l'ancêtre le plus général - dans ce cas, Object. Ceci est trop général, car il peut également recevoir des valeurs qui ne sont pas comparables (et générerait des erreurs lorsque vous essayez de les comparer).

Ainsi, l'interface Comparable: elle sélectionne toutes les classes qui implémentent la fonctionnalité de comparaison à travers la hiérarchie sous-classe-superclasse.

5
Amadan