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

cette question a déjà une réponse ici:

je me demandais quand utiliser les interfaces.

pensons à 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 également ajouter quelques variables à ma classe de véhicule, qui devrait probablement être utilisé 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: http://www.thecoldsun.com/en/content/01-2009/abstract-classes-and-interfaces

79
demandé sur drewmoore 2013-05-28 02:30:19

21 réponses

à Partir de Java Comment Programme sur les classes abstraites:

parce qu'ils ne sont utilisés que comme superclasses dans les hiérarchies héréditaires, nous les appelons les superclasses abstraites. ces classes ne peuvent être utilisé pour instancier des objets, parce que les classes abstraites sont incomplètes. Les sous-classes doivent déclarer les "pièces manquantes" pour devenir "béton" classes, à partir de laquelle vous pouvez instancier des objets. Dans le cas contraire, ces sous-classes aussi, sera abstraite.

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

Un classe abstraite de l'objet est d'une super-classe dont d'autres classes peuvent hériter et ainsi partager un dessin commun.

par opposition à une interface:

Un interface décrit un ensemble de méthodes qui peuvent être appelées sur un objet, mais ne fournit pas d'implémentations concrètes pour tous les les méthodes de ... 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 de la class sont garantis pour fournir les fonctionnalités décrites par le interface. cela vaut également 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 quand vous voulez une implémentation complète et utiliser des classes abstraites quand vous voulez des pièces partielles pour votre conception (pour la réutilisabilité)

90
répondu kgdesouz 2017-08-06 09:24:50

Que devez-vous utiliser, classes abstraites ou interfaces?

envisagez d'utiliser les classes abstraites si l'un de ces énoncés s'applique à votre situation:

vous voulez partager le code entre plusieurs classes étroitement liées.

vous vous attendez à ce que les classes qui étendent votre classe abstraite aient beaucoup de méthodes ou de champs communs, ou nécessitent des modificateurs d'accès autres que publique (telle que protégée et privée).

vous voulez déclarer les champs non-statiques ou non-finaux. Cela vous permet de définir les méthodes qui peut accéder et modifier l'état de l'objet à laquelle ils appartiennent.

envisagez d'utiliser les interfaces si l'un de ces énoncés s'applique à votre situation:

vous vous attendez à ce que des classes indépendantes implémentent votre interface. Par exemple, les interfaces Comparables et Cloneable sont implémentés par de nombreuses classes sans rapport.

vous voulez spécifier le comportement d'un type de données particulier, mais ne vous souciez pas de qui implémente son comportement.

Vous voulez profiter de l'héritage multiple de type.

15
répondu shishir 2015-11-29 14:57:39

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

Les Interfaces

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

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

utilisez des classes abstraites quand il y a 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
répondu DanFromGermany 2016-10-10 12:24:27

il y a un certain nombre de fois où vous pourriez envisager d'utiliser une interface au-dessus d'une implémentation abstraite

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

D'une manière générale, des interfaces ont été introduites pour surmonter le manque d'héritage multiple, entre autres choses

7
répondu MadProgrammer 2013-08-22 12:55:08

avec le soutien des méthodes par défaut dans l'interface depuis le lancement de Java 8, l'écart entre interface et abstract classes a été réduit, mais ils ont encore des différences majeures.

  1. les Variables dans l'interface sont public static final . Mais classe abstraite peut avoir d'autres types de variables comme privé, protégé etc

  2. les méthodes dans l'interface sont public ou public static mais les méthodes dans la classe abstraite peuvent être privé et protégé trop

  3. Utiliser la classe abstraite pour établir la relation entre les objets interdépendants. Utiliser interface pour établir une relation entre des classes non apparentées.

Avoir un oeil à cette article pour des propriétés particulières de interface dans java 8. le modificateur statique pour les méthodes par défaut dans l'interface provoque une erreur de compilation dans le temps de l'erreur dérivée si vous voulez utiliser @override.

cet article explique pourquoi les méthodes par défaut ont été introduites en java 8: pour améliorer L'API Collections en Java 8 pour prendre en charge les expressions lambda.

regarder oracle documentation trop à comprendre les différences dans la meilleure façon.

jetez un coup d'oeil à ces questions se connexes Avec exemple de code pour mieux comprendre les choses:

comment aurais-je dû expliquer la différence entre une Interface et une classe abstraite?

3
répondu Ravindra babu 2017-05-23 12:26:20

Blog de référence: https://mybolder.com/2015/12/02/when-to-use-abstract-class-and-intreface/

Que devez-vous utiliser, classes abstraites ou interfaces?

envisagez d'utiliser des classes abstraites si l'un de ces énoncés s'applique à votre situation:

  1. vous voulez partager le code entre plusieurs classes étroitement liées.
  2. vous attendez que les classes qui étendent votre classe abstraite ont beaucoup de méthodes ou de champs communs, ou nécessitent des modificateurs d'accès autres que publics (tels que protégé et privé).
  3. vous voulez déclarer les champs non-statiques ou non-finaux. Cela vous permet de définir les méthodes qui peut accéder et modifier l'état de l'objet à laquelle ils appartiennent.

envisagez d'utiliser des interfaces si l'un de ces énoncés s'applique à votre situation:

  1. vous vous attendez à ce que des classes indépendantes implémentent votre interface. Par exemple, les interfaces comparables et Clonables sont implémentées par de nombreuses classes indépendantes.
  2. vous voulez spécifier le comportement d'un type de données particulier, mais ne vous souciez pas de qui implémente son comportement.
  3. Vous voulez profiter de l'héritage multiple de type.

exemple de classe abstraite dans le JDK est AbstractMap , qui fait partie du cadre des Collections. Ses sous-classes (qui comprennent HashMap , TreeMap , et Competienthashmap ) partagent de nombreuses méthodes (y compris get , put , isEmpty , containsKey , et Containsvalue ) que abstractmap définit.

2
répondu Akash5288 2016-06-03 10:39:10

Compte Tenu De Java:

Interfaces:

  • Sont un des fondamentaux de la programmation orientée objet à l'abstraction.
  • donnera souvent (mais pas toujours) un code plus clair que les classes abstraites.
  • peut être mis en œuvre par plusieurs classes de béton pour s'adapter à différentes situations.
  • peut directement implémenter des scénarios appelant un héritage multiple.
  • peut être plus facilement moqué pour des fins de test.
  • sont utiles pour les mandataires JDK (voir java.lang.refléter.Proxy.)

ce n'est que le début d'une très longue liste de pour/contre pour les interfaces vs. classes abstraites.

1
répondu Arthur Dent 2013-05-27 22:44:58

C'est un direct extrait de l'excellent livre " Thinking in Java " par Bruce Eckel.

[..] Devez-vous utiliser une interface 151970920 "ou une classe abstract class ?

Eh bien, une interface vous donne les avantages d'une classe abstraite et les avantages d'une interface, donc s'il est possible de créer votre classe de base sans n'importe quelles définitions de méthode ou de membre variables vous devriez toujours préférer les interfaces aux classes abstraites.

en fait, si vous savez que quelque chose va être une classe de base, votre premier choix devrait être d'en faire une interface, et seulement si vous êtes forcé d'avoir des définitions de méthode ou des variables de membre si vous changez à une classe abstraite.

1
répondu fortytwo 2016-11-04 03:09:56

utilisez une classe abstract lorsque vous voulez définir un template pour un groupe de sous-classes , et vous avez au moins un code d'implémentation que call sub-classes pourrait utiliser.

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

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'une classe abstraite vous permet un peu de flexibilité ici.

1
répondu 2017-04-24 19:02:35

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 devriez utiliser des interfaces à la place quand vous savez que vous allez Toujours mettre en œuvre ces méthodes. Aussi vous pouvez hériter de multiples interfaces, c'est la façon de java de traiter l'héritage multiple

0
répondu Will Jamieson 2013-05-27 22:56:30
L'interface

est essentiellement 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 l'interface par exemple. dans jdbc JDBC fournisseurs nous fournir quelques interfaces bcoz, ils veulent tout cacher de nous.

La classe abstraite

n'est utilisée que dans ce cas lorsque nous voulons supporter un comportement commun dans plus d'une classe...ou vous voulez fournir une mise en œuvre pré-implémentée avec une mise en œuvre non-implémentée méthodes(méthodes abstraites). par exemple. http servlet in servlet interface est une classe abstraite bcoz cette classe implémente l'interface de servlet sauf sa méthode de service...cette classe nous aide donc à obtenir une préimplémentation de la méthode d'interface...

0
répondu praveen tyagi 2014-03-03 14:48:45

réellement Interface et classe abstraite sont utilisés pour juste spécifier certains contrat/règles qui montreront juste, comment leurs sous-classes seront.

la plupart du temps, nous savons que l'interface est un pur abstrait.Signifie que vous ne pouvez pas spécifier une méthode unique avec le corps.Ce point particulier est celui des avantages de la classe abstraite.Les moyens dans la classe abstraite u ont le droit de spécifier la méthode avec le corps et sans le corps aussi bien.

donc si vous voulez préciser quelque chose sur sous-classe ur, puis u peut aller pour l'interface. Mais si u veut aussi spécifier quelque chose pour les sous-classes ur et que u veut aussi que la classe ur ait sa propre méthode.Alors dans ce cas u peut aller pour la classe abstraite

0
répondu sridhar 2014-04-01 07:18:05

vous ne pouvez pas obtenir l'héritage multiple avec la classe abstraite qui est pourquoi sun microsystem fournir des interfaces.

vous ne pouvez pas étendre deux classes mais vous pouvez implémenter plusieurs interfaces""

0
répondu kavi temre 2015-03-20 14:06:58

Interface et Abstract Class sont les deux différentes façons de parvenir à l'Abstraction dans la programmation orientée objet les Langues.

Interface provides 100% abstraction, I. e toutes les méthodes sont abstraites.

Abstract class provides 0 to 100% abstraction,I. e elle peut avoir ou ne pas avoir de méthodes abstraites.

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

nous pouvons utiliser Abstract Class lorsque certaines fonctionnalités communes peuvent être fournies par Abstract Class implémenter et le client aura la chance de mettre en œuvre ce dont il a besoin en fait.

0
répondu Raghu 2016-07-19 19:19:24

Abstract Class : utilisez-le lorsqu'il y a une relation forte is-a entre la super classe et la sous-classe et que toutes les sous-classes ont un comportement commun .

Interface : elle définit le protocole juste que toutes les sous-classes doivent suivre.

0
répondu Ravi Soni 2016-10-06 06:10:02

la réponse à cette question est très simple,quoi que nous puissions faire avec l'interface peut être fait avec la classe abstraite D'accord...donc quand utiliser les interfaces,la réponse se trouve dans C# restriction de l'héritage multiple. Quand vous avez seulement des contrats (abstracts) à déclarer et que vous voulez que vos sous-classes l'implémentent, cela va avec les interfaces, parce que si vous utilisez la classe abstraite dans ce cas, vous ne pouvez pas hériter d'une classe de plus et vous êtes bloqué si vous voulez hériter d'une classe de plus, mais vous pouvez implémenter comme de nombreuses interfaces.

0
répondu Dinesh 2017-06-03 20:12:40

si vous utilisez JDK 8, Il n'y a aucune raison d'utiliser des classes abstraites car quoi que nous fassions avec des classes abstraites, nous pouvons maintenant le faire avec des interfaces à cause des méthodes par défaut. Si vous utilisez abstract class vous devez l'étendre et il y a une restriction que vous pouvez étendre qu'une seule fois. Mais si vous utilisez l'interface, vous pouvez en implémenter autant que vous voulez.

Interface est par défaut une classe abstraite et toutes les méthodes et les constructeurs sont publics.

0
répondu HM Nayem 2017-08-16 18:22:03

j'ai trouvé cette très bonne explication ici espérer qu'il aide quelqu'un. lire ici

0
répondu Abhilash Reddy 2018-01-09 20:33:26
Les Interfaces

et les classes abstraites semblent très similaires, mais il y a des différences importantes entre elles.

l'Abstraction est basé sur un " bon est-un relation". Ce qui signifie que vous dirais qu'une voiture est une Honda, et un Honda est une voiture. Utiliser l'abstraction sur une classe signifie que vous pouvez aussi avoir des méthodes abstraites. Cela nécessiterait une sous-classe de l'extension d'obtenir les méthodes abstraites et de les remplacer. En utilisant l'exemple ci-dessous, nous pouvons créer une méthode abstraite howToStart(); qui demandera à chaque classe de l'implémenter.

par abstraction, nous pouvons fournir des similitudes entre les codes de sorte que nous aurions encore une classe de base. En utilisant un exemple de l'idée de classe de voiture nous pourrions créer:

public abstract class Car{
    private String make;
    private String model

    protected Car() { }  // Default constructor

    protect Car(String make, String model){
        //Assign values to 
    }

    public abstract void howToStart();
}

alors avec la classe Honda nous aurions:

public class Honda extends implements Engine {

    public Honda() { }  // Default constructor

    public Honda(String make, String model){
        //Assign values
    }

    @Override
    public static void howToStart(){
        // Code on how to start
    }

}
Les Interfaces

sont basées sur la relation" has-a". Cela signifie que vous pourriez dire qu'une voiture a un moteur, mais un moteur n'est pas une voiture. Dans L'exemple ci-dessus, Honda a implements Engine .

Pour le moteur de l'interface nous pourrons créer des:

public interface Engine {
    public void startup();
}

l'interface fournira une instance de plusieurs à un. Donc on peut appliquer l'interface moteur à n'importe quel type de voiture. On peut aussi l'étendre à d'autres objets. Comme si nous devions faire une classe de bateau, et avoir des sous-classes de types de bateau, nous pourrions étendre le moteur et avoir les sous-classes de bateau startup(); la méthode. Les Interfaces sont bonnes pour créer le cadre à diverses classes qui ont des similitudes. Nous pouvons également implémenter plusieurs instances dans une même classe, comme:

public class Honda extends implements Engine, Transmission, List<Parts>

espérons que ça aide.

-1
répondu Joshua Kern 2016-11-04 23:13:40

si vous êtes dans une situation où l'implémentation de votre méthode D'Interface est la même pour toutes les classes héritées, alors vous n'avez pas besoin d'interface, à la place la classe abstraite aurait dû être utilisée. Quand vous voulez que quelque chose soit suivi par chaque classe (doit avoir) et là l'implémentation serait différente ou non définie alors nous allons pour L'Interface.

-2
répondu Brij Mohan Singh 2016-02-17 15:34:02