web-dev-qa-db-fra.com

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

Je me demandais quand je devrais utiliser des interfaces.

Permet de penser à ce qui suit:

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

et :

public interface IVehicle {
  float getSpeed();
}

Je peux facilement implémenter les deux, ils ont la même fonctionnalité ... MAIS je peux aussi ajouter des 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!

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

81
augmentie123

De Java Comment programmer sur les classes abstraites:

Parce qu’elles ne sont utilisées que comme superclasses dans les hiérarchies d’héritage, nous les appelons superclasses abstraites. Ces classes ne peuvent pas être utilisé pour instancier des objets, car les classes abstraites sont incomplètes. Les sous-classes doivent déclarer les “pièces manquantes” pour devenir des classes “concrètes”, à partir duquel vous pouvez instancier des objets. Sinon, ces sous-classes aussi sera abstrait.

Pour répondre à votre question "Quelle est la raison d'utiliser des interfaces?":

Le but d’une classe abstract est de fournir une super-classe appropriée à partir duquel d'autres classes peuvent hériter et ainsi partager une conception commune.

Par opposition à une interface:

Une interface décrit un ensemble de méthodes pouvant être appelées sur un fichier objet, mais ne fournit pas d’implémentations concrètes pour tous les méthodes ... Une fois qu'une classe implémente une interface, tous les objets de cette classe ont une relation is-a avec le type d'interface et tous les objets du fichier sont assurés de fournir la fonctionnalité décrite par le interface. Ceci est également vrai pour toutes les sous-classes de cette classe.

Donc, pour répondre à votre question "Je me demandais quand je devrais utiliser des interfaces", je pense que vous devriez utiliser des interfaces lorsque vous souhaitez une implémentation complète et des classes abstraites lorsque vous souhaitez des éléments partiels pour votre conception (pour pouvoir être réutilisés). 

91
kgdesouz

À partir des tutoriels Oracle :

Contrairement aux interfaces, les classes abstract peuvent contenir des champs autres questatic et final et peuvent également contenir des méthodes implémentées. De telles classes abstraites sont similaires aux interfaces, à la différence qu’elles fournissent une implémentation partielle, laissant le soin aux sous-classes de terminer l’implémentation. Si une classe abstraite contient uniquement des déclarations de méthodes abstraites, elle doit plutôt être déclarée comme interface.

Plusieurs interfaces peuvent être implémentées par les classes n'importe où dans la hiérarchie des classes, qu'elles soient ou non liées les unes aux autres. Pensez à Comparable ou Cloneable, par exemple.

Par comparaison, les classes abstract sont le plus souvent sous-classées afin de partager des éléments d’implémentation. Une classe abstraite unique est sous-classée par des classes similaires qui ont beaucoup en commun (les parties implémentées de la classe abstraite), mais qui présentent également des différences (les méthodes abstraites).

15

De nombreux cas peuvent être implémentés dans les deux types de classe.

Les interfaces sont utiles lorsque vous voulez définir une classe qui doit avoir au moins des fonctions de base. Comme une véritable interface, par exemple USB.

interface USB {
    public function sendPower(); //charge iphone for example
    public function sendData(); //iTunes
    public function recieveData();
}

Utilisez des classes abstraites lorsqu'il existe plusieurs façons d'implémenter un objet.

abstract class MobilePhone {
    public function isIphone();

    public function charge() {
        //get some power, all phones need that
    }
}

class iPhone extends MobilePhone {
    public function isIphone() { return true; }
}
8
DanFromGermany

Il y a un certain nombre de fois que vous pourriez envisager d'utiliser une interface sur une implémentation abstraite

  • Lorsque l’implémentation abstraite disponible ne fait pas ce que vous voulez et que vous voulez créer votre propre
  • lorsque vous avez une classe existante (qui s'étend d'une autre classe) et que vous souhaitez implémenter les fonctionnalités de l'interface

De manière générale, les interfaces ont été introduites pour pallier le manque d'héritage multiple, entre autres 

7
MadProgrammer

Grâce au support des méthodes par défaut dans l’interface depuis le lancement de Java 8, l’écart entre les classes interface et abstract a été réduit, mais il existe encore des différences majeures.

  1. Les variables de l'interface sont public static final. Mais la classe abstraite peut avoir d'autres types de variables comme private, protected etc.

  2. Les méthodes de l'interface sont public ou public static mais les méthodes de la classe abstraite peuvent également être private et protected.

  3. Utilisez classe abstraite pour établir une relation entre des objets liés entre eux. Utilisez interface pour établir une relation entre des classes non liées.

Jetez un oeil à cet article pour les propriétés spéciales de interface en Java 8. Le modificateur statique pour les méthodes par défaut dans l'interface provoque une erreur de compilation dans une erreur dérivée si vous souhaitez utiliser @override.

Cet article explique pourquoi des méthodes par défaut ont été introduites dans Java 8: Pour améliorer l'API Collections dans Java 8 afin de prendre en charge les expressions lambda.

Jetez un coup d'œil à Oracle documentation également pour mieux comprendre les différences.

Jetez un coup d’œil à ces questions SE associées à un exemple de code pour mieux comprendre les choses: 

Comment aurais-je dû expliquer la différence entre une classe d'interface et une classe abstraite?

3
Ravindra babu

From Tutoriels Java ™ - Classes abstraites comparées aux interfaces

Lequel devriez-vous utiliser, des classes abstraites ou des interfaces?

  • Pensez à 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 pouvant accéder à et modifier l'état de l'objet auquel elles appartiennent.
  • Pensez à utiliser des interfaces si l’une de ces affirmations s’applique à votre situation:
    • Vous vous attendez à ce que des classes non liées implémentent votre interface. Par exemple, les interfaces Comparable et Cloneable sont implémentées par de nombreuses classes non liées.
    • Vous souhaitez spécifier le comportement d'un type de données particulier, sans vous soucier de savoir qui l'implémente.
    • Vous souhaitez tirer parti de l'héritage multiple de type.

Un exemple de classe abstraite dans le JDK est AbstractMap, qui fait partie de Collections Framework. Ses sous-classes (qui incluent HashMap, TreeMap et ConcurrentHashMap) partagent de nombreuses méthodes (y compris get, put, isEmpty, containsKey et containsValue) définies par AbstractMap.

3
Akash5288

Considérant Java:

Interfaces:

  • Sont une abstraction fondamentale OOP.
  • Générera souvent (mais pas toujours) un code plus clair que les classes abstraites.
  • Peut être mis en œuvre par plusieurs classes concrètes pour convenir à différentes situations.
  • Peut directement implémenter des scénarios faisant appel à plusieurs héritages.
  • Peut être plus facilement simulé à des fins de test.
  • Sont utiles pour les mandataires JDK (voir Java.lang.reflect.Proxy).

Ce ne sont que le début d'une très longue liste d'avantages/inconvénients pour les interfaces par rapport aux classes abstraites.

1
Arthur Dent

Utilisez une classe abstraite lorsque vous souhaitez définir un modèle pour un groupe de sous-classes et vous disposez d'au moins un code d'implémentation que les sous-classes d'appel peuvent utiliser. .

Utilisez un interface lorsque vous souhaitez définir le rôle que d'autres classes peuvent jouer, , quel que soit leur emplacement dans l'arbre d'héritage

vous extend une classe abstraite

vous implémentez une interface :)

dans une interface tous les champs sont automatiquement publicstaticfinal et tous les méthodes sont public Tandis que classe abstraite vous permet un peu de flexibilité ici.

1
user2768308

Ceci est un extrait direct de l'excellent livre ' Thinking in Java ' de Bruce Eckel.

[..] Devriez-vous utiliser une interface ou une classe abstraite

Une interface vous offre les avantages d’une classe abstraite et les avantages d’une interface. Par conséquent, s’il est possible de créer votre classe de base sans définition de méthode ni variable membre, vous devez toujours préférer les interfaces aux classes abstraites. 

En fait, si vous savez que quelque chose va devenir une classe de base, vous devez d’abord en faire une interface. Si vous êtes obligé d’avoir des définitions de méthodes ou des variables membres, passez à une classe abstraite.

1
fortytwo

Classe abstraite : Utilisez-le lorsqu'il existe une relation forte entre super classe et sous-classe et que toutes les sous-classes partagent un comportement commun.

Interface : Définit simplement le protocole que toutes les sous-classes doivent suivre.

0
Ravi Soni

Vous ne pouvez pas obtenir l'héritage multiple avec une classe abstraite, c'est pourquoi Sun Microsystems fournit des interfaces. 

Vous ne pouvez pas étendre deux classes, mais vous pouvez implémenter plusieurs interfaces.

0
kavi temre

Les classes abstraites peuvent contenir des méthodes qui ne sont pas abstraites, alors que dans les interfaces, toutes vos méthodes sont abstraites et doivent être implémentées.

Vous devez utiliser des interfaces lorsque vous savez que vous allez toujours implémenter ces méthodes. Vous pouvez également hériter de plusieurs interfaces. C’est la façon dont Java gère les héritages multiples.

0
Will Jamieson

En fait, Interface et classe abstraite sont utilisés pour spécifier quelques contrats/règles qui montreront simplement comment leurs sous-classes seront. 

La plupart du temps, nous savons que cette interface est un pur résumé. Cela signifie que vous ne pouvez pas spécifier une méthode unique avec body.Ce point particulier concerne les avantages de abstract class.Les moyens de la classe abstract u ont le droit de spécifier une méthode avec body et sans body. 

Donc, si vous voulez spécifier quelque chose à propos de votre sous-classe, vous pouvez utiliser l'interface. Mais si vous voulez aussi spécifier quelque chose pour vos sous-classes et que vous voulez aussi que votre classe ait aussi sa propre méthode.Ensuite, vous pouvez choisir une classe abstraite.

0
sridhar

l’interface est généralement utilisée lorsque deux parties travaillent ensemble et qu’une partie veut cacher quelque chose à l’autre (ou ne veut montrer qu’une partie de sa classe) .que nous utilisons une interface, par exemple . dans jdbc Les fournisseurs de jdbc nous fournissent des interfaces ils veulent tout nous cacher.

la classe abstraite n'est utilisée que dans le cas où nous souhaitons prendre en charge un comportement commun dans plusieurs classes ... ou si nous souhaitons fournir une implémentation préimplémentée avec des méthodes non implémentées (les méthodes doivent être abstraites) . http servlet dans l'interface de servlet est une classe abstraite bcoz cette classe implémente l'interface de servlet, à l'exception de sa méthode de service ... cette classe nous aide donc à obtenir une préimplémentation de la méthode d'interface ... 

0
praveen tyagi

La réponse à cette question est très simple. Tout ce que nous pouvons faire avec une interface peut être fait avec la classe abstraite Agree ... alors quand utiliser des interfaces, la réponse réside dans la restriction C # de l'héritage multiple. Lorsque vous n'avez que des contrats (résumés) à déclarer et que vos sous-classes l'implémentent, utilisez des interfaces, car si vous utilisez la classe abstraite dans ce cas, vous ne pouvez pas hériter d'une autre classe et vous êtes bloqué si vous souhaitez en hériter plus de classe, mais vous pouvez implémenter autant d’interfaces.

0
Dinesh

Si vous utilisez JDK 8, il n'y a aucune raison d'utiliser des classes abstraites car, quoi que nous fassions avec les classes abstraites, nous pouvons maintenant le faire avec des interfaces en raison des méthodes par défaut. Si vous utilisez une classe abstraite, vous devez l’étendre et il existe une restriction voulant que vous ne puissiez étendre qu’une seule fois. Mais si vous utilisez l'interface, vous pouvez en implémenter autant que vous le souhaitez. 

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

0
HM Nayem

Interface et Abstract Class sont les deux manières différentes d'obtenir l'abstraction dans les langues OOP.

L’interface fournit une abstraction 100%, c’est-à-dire que toutes les méthodes sont abstraites.

La classe abstraite fournit une abstraction 0 to 100%, c’est-à-dire qu’elle peut avoir ou non des méthodes abstraites.

Nous pouvons utiliser Interface lorsque nous voulons que toutes les fonctionnalités d'un type soient implémentées par le client.

Nous pouvons utiliser Abstract Class lorsque des fonctionnalités communes peuvent être fournies par Abstract Class et son client aura la possibilité de mettre en œuvre ce dont il a réellement besoin. 

0
Raghu