42 votes

L'importance des interfaces en Java

Disons que nous avons deux classes, Tiger y Aeroplane . Un point commun à ces deux types est la vitesse. Je sais qu'il serait illogique de créer une superclasse ClassWithSpeed et ensuite dériver des sous-classes Aeroplane y Tiger d'elle. Au lieu de cela, il est préférable de créer une interface qui contient la méthode speed() et l'implémenter ensuite dans Aeroplane y Tiger . Je comprends. Mais, on peut faire la même chose sans interfaces. Nous pourrions définir une méthode speed() en Aeroplane et méthode speed() en Tiger . Le seul (peut-être très gros) défaut serait que nous ne pourrions pas "atteindre" les objets de l'UE. Tiger y Aeroplane par le biais d'une référence d'interface.

Je suis débutant en Java et en POO, et je serais très reconnaissant si quelqu'un m'expliquait le rôle des interfaces. A bientôt !

71voto

C'est :

public int howFast(Airplane airplane) {
    return airplane.speed();
}

public int howFast(Tiger tiger) {
    return tiger.speed();
}

public int howFast(Rocket rocket) {
    return rocket.speed();
}

public int howFast(ThingThatHasntBeenInventedYet thingx) {
    // wait... what? HOW IS THIS POSSIBLE?!
    return thingx.speed();
}

...

vs

public int howFast(Mover mover) {
    return mover.speed();
}

Maintenant, imaginez avoir à revenir en arrière et changer tous ces howFast fonctions à l'avenir.

Interface ou non, chaque classe devra mettre en œuvre ou hériter de l'interface speed() méthode. Une interface vous permet d'utiliser ces classes disparates plus facilement, car elles ont toutes promis de se comporter d'une certaine manière. Vous appellerez speed() et ils renverront un int Ainsi, vous n'avez pas besoin d'écrire des méthodes distinctes pour chaque classe possible.

Lorsque vous vous apercevez que vous devez gérer la vitesse différemment en raison d'une avancée de la physique relativiste, il vous suffit de mettre à jour les méthodes qui font appel à speed() . Quand votre arrière-petite-fille écrit un cours pour HyperIntelligentMonkeyFish Elle n'a pas besoin de démonter votre ancien binaire et d'effectuer des modifications pour que votre code puisse surveiller et contrôler son armée de mutants. Elle doit seulement déclarer que HyperIntelligentMonkeyFish implements Mover .

8voto

Yishai Points 42417

Les interfaces permettent à Java, puisqu'il est typiquement statique, de contourner les limitations de l'héritage multiple dans la mesure où les concepteurs du langage le jugent utile.

Dans un langage dynamique (comme Python, Ruby, etc.), vous pouvez simplement appeler la méthode speed sur n'importe quel objet arbitraire et découvrir au moment de l'exécution s'il est là ou non.

Java, en revanche, est typée statiquement, ce qui signifie que le compilateur doit accepter à l'avance que la méthode sera présente. La seule façon de faire cela sur des classes qui n'ont pas d'ancêtres communs, et qui peuvent n'avoir qu'un objet en commun, est une interface.

Étant donné que les objets peuvent implémenter un nombre arbitraire d'interfaces, cela signifie que vous bénéficiez des avantages de l'héritage multiple (un seul objet qui peut se présenter comme plusieurs objets différents pour différentes méthodes) sans les inconvénients (implémentations conflictuelles dans les deux super classes).

Avec Java 8, les concepteurs du langage ont conclu que les interfaces sans aucune implémentation étaient trop restrictives (ils n'aimaient pas les ma solution Je suppose ;-)), ils permettent donc une mise en œuvre par défaut, ce qui élargit les options de multi-héritage des interfaces, tout en essayant d'éviter le problème de mise en œuvre conflictuelle par le biais de un ensemble complexe de règles de préséance afin qu'il y ait une implémentation par défaut non ambiguë à exécuter.

6voto

StinePike Points 20501

J'essaie d'expliquer l'avantage de l'interface avec l'exemple suivant-

supposez que vous avez une autre classe où vous devez utiliser le tigre ou l'AeroPlane comme paramètre. En utilisant l'interface, vous pouvez appeler en utilisant

someObject.someMethod(ClassWithSpeed)

mais si vous n'utilisez pas l'interface, vous pouvez utiliser

someObject.someMethod(Tiger)
someObject.someMethod(AeroPlane)

Qu'est-ce que tu dois faire maintenant ? Votre réponse probable sera la suivante, "I will use two overloaded method".

C'est bien jusqu'à présent, mais

Supposons que vous ayez besoin d'ajouter d'autres options (disons voiture, vélo, lapin, tortue.... 100 autres). Alors que ferez-vous pour faire le changement de votre code existant ? vous aurez besoin de changer beaucoup de choses...

L'exemple global ci-dessus n'a qu'un seul but. Il s'agit de dire

"nous avons besoin d'une interface pour créer une meilleure, réutilisable et correctement orientée objet design"

N.B.

  1. si vous êtes sûr que le programme est trop petit et que vous n'aurez jamais besoin de les modifier, je pense que vous pouvez implémenter sans interface.

5voto

Andy Thomas Points 30979

La définition d'une interface vous permet de définir des méthodes qui fonctionnent non seulement sur Aeroplane et Tiger, mais aussi sur d'autres classes qui partagent la même interface.

Par exemple, disons que votre interface est IObjectWithSpeed. Vous pouvez alors définir une méthode comme celle-ci -- dans une seule classe qui opère sur les objets IObjectWithSpeed.

  public double calculateSecondsToTravel( IObjectWithSpeed obj, double distance ) {
       return distance / obj.getSpeed();
  }

Les interfaces nous permettent de satisfaire la principe d'ouverture/fermeture - ouvert à l'extension, mais fermé à la modification. L'implémentation unique de la méthode ci-dessus n'a pas besoin d'être modifiée car de nouvelles classes sont définies qui implémentent IObjectWithSpeed.

3voto

anana Points 591

Outre le fait qu'elles décrivent la fonctionnalité de ces classes, les méthodes d'une interface peuvent être utilisées sans que l'on connaisse les classes qui l'implémentent, même pour les classes qui n'ont pas encore été définies.

Donc par exemple, si vous avez besoin d'une classe Transport qui calcule les itinéraires les plus efficaces, on pourrait lui donner une classe qui implémente ClassWithSpeed comme paramètre et utiliser sa méthode speed() pour calculer ce dont il a besoin. De cette façon, vous pourriez l'utiliser avec notre classe Aeroplane mais aussi avec toute classe que nous définirons plus tard, par exemple Boat . Java s'occupera de faire en sorte que si vous voulez utiliser une classe comme paramètre de Transport il mettra en œuvre ClassWithSpeed et que toute classe implémentant ClassWithSpeed met en œuvre la méthode speed() afin qu'il puisse être utilisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X