90 votes

Quand dois-je utiliser les interfaces au lieu des classes abstraites ?

Je me demandais quand je devais utiliser les interfaces.

Réfléchissons à ce qui suit :

public abstract class Vehicle {
   abstract float getSpeed();
}

et :

public interface IVehicle {
  float getSpeed();
}

Je peux facilement mettre en œuvre les deux, ils ont la même fonctionnalité... MAIS je peux aussi ajouter quelques variables à ma classe de véhicule, qui devraient probablement être utilisées dans un véhicule (maxSpeed, carType...)

Quelle est la raison d'utiliser des interfaces ?

Merci !

EDITAR: J'ai trouvé un lien intéressant à ce sujet dans un autre fil de discussion : http://www.thecoldsun.com/en/content/01-2009/abstract-classes-and-interfaces

5voto

akash746 Points 109

En The Java™ Tutorials - Les classes abstraites comparées aux interfaces

Que devez-vous utiliser, les classes abstraites ou les interfaces ?

  • Envisagez d'utiliser des classes abstraites si l'une de ces affirmations s'applique à votre situation :
    • Vous souhaitez partager du code entre plusieurs classes étroitement liées.
    • Vous vous attendez à ce que les classes qui étendent votre classe abstraite aient de nombreuses méthodes ou champs communs, ou nécessitent des modificateurs d'accès autres que public (tels que protected et private).
    • Vous voulez déclarer des champs non statiques ou non finaux. Cela vous permet de définir des méthodes qui peuvent accéder et modifier l'état de l'objet auquel elles appartiennent.
  • Envisagez d'utiliser des interfaces si l'une de ces affirmations s'applique à votre situation :
    • Vous vous attendez à ce que les classes non liées implémentent votre interface. Par exemple, les interfaces Comparable y Cloneable sont mises en œuvre par de nombreuses classes non liées.
    • Vous voulez spécifier le comportement d'un type de données particulier, mais sans vous préoccuper de savoir qui met en œuvre son comportement.
    • Vous voulez profiter de l'héritage multiple du type.

Un exemple de classe abstraite dans le JDK est AbstractMap qui fait partie du Collections Framework. Ses sous-classes (qui comprennent HashMap , TreeMap et ConcurrentHashMap ) partagent de nombreuses méthodes (notamment get , put , isEmpty , containsKey et containsValue ) que AbstractMap définit.

4voto

Utilisez un abstrait lorsque vous souhaitez définir une classe modèle pour un groupe de sous-classes, et vous disposez au moins d'un code de mise en œuvre que les sous-classes d'appel pourraient utiliser.

Utilisez un interface lorsque vous voulez définir le rôle que les autres classes peuvent jouer, indépendamment de l'endroit où ces classes se trouvent dans l'arbre d'héritage

vous étendre une classe abstraite

vous mettre en œuvre une interface :)

dans un interface tous les champs sont automatiquement public static final et tous les méthodes sont public alors qu'un classe abstraite vous permet un peu de flexibilité ici.

1voto

Arthur Dent Points 766

Considérant Java :

Interfaces :

  • Sont une abstraction fondamentale de la POO.
  • produiront souvent (mais pas toujours) un code plus clair que les classes abstraites.
  • Peut être mis en œuvre par plusieurs classes concrètes pour s'adapter à différentes situations.
  • Peut mettre en œuvre directement des scénarios faisant appel à l'héritage multiple.
  • Il est plus facile de faire des simulations à des fins de test.
  • Sont utiles pour les proxies JDK (voir java.lang.reflect.Proxy).

Ce n'est que le début d'une très longue liste d'avantages et d'inconvénients des interfaces par rapport aux classes abstraites.

1voto

Dinesh Points 11

La réponse à cette question est très simple, tout ce que l'on peut faire avec une interface peut être fait avec une classe abstraite...alors quand utiliser les interfaces, la réponse se trouve dans la restriction C# de l'héritage multiple. Lorsque vous n'avez que des contrats (abstraits) à déclarer et que vous voulez que vos sous-classes les mettent en œuvre, allez-y avec les interfaces, car si vous utilisez une classe abstraite dans ce cas, vous ne pouvez pas hériter d'une autre classe et vous êtes coincé si vous voulez hériter d'une autre classe, mais vous pouvez mettre en œuvre autant d'interfaces.

1voto

HM Nayem Points 797

Si vous utilisez le JDK 8, il n'y a aucune raison d'utiliser des classes abstraites car tout ce que nous faisons avec les classes abstraites, nous pouvons maintenant le faire avec les interfaces grâce aux méthodes par défaut. Si vous utilisez une classe abstraite, vous devez l'étendre et il existe une restriction selon laquelle vous ne pouvez l'étendre qu'une seule fois. Mais si vous utilisez une interface, vous pouvez l'implémenter autant que vous le souhaitez.

L'interface est par défaut une classe abstraite et toutes les méthodes et tous les constructeurs sont publics.

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