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

112voto

kgdesouz Points 1814

En Comment programmer en Java sur les classes abstraites :

Parce qu'ils ne sont utilisés que comme superc nous les appelons des superclasses abstraites. Ces classes ne peuvent pas être utilisées pour instancier des objets, car les classes abstraites sont incomplètes. Les sous-classes doivent déclarer les "pièces manquantes" pour devenir des "co à partir desquelles on peut instancier des objets. Sinon, ces sous-classes, elles aussi seront abstraites.

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

Un site objectif de la classe abstraite est de fournir une aide appropriée dont d'autres classes peuvent hériter et ainsi partager une conception commune.

Par opposition à une interface :

Un site l'interface décrit un ensemble de méthodes qui objet, mais ne fournit pas d'implémentations concrètes pour toutes 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 a sont garantis de fournir la fonctionnalité décrite par l'interface. l'interface. Cela vaut également pour toutes les sous-classes de cette classe.

Donc, pour répondre à votre question "Je me demandais quand je devais utiliser les interfaces", je pense que vous devez utiliser les interfaces lorsque vous voulez une implémentation complète et utiliser les classes abstraites lorsque vous voulez des éléments partiels pour votre conception (pour la réutilisation).

18voto

kocko Points 18585

Desde el Didacticiels Oracle :

Contrairement aux interfaces, Les classes abstraites peuvent contenir des champs qui ne sont pas static y final et ils peuvent contenir des méthodes mises en œuvre. Ces classes abstraites sont similaires aux interfaces, sauf qu'elles fournissent une implémentation partielle, laissant aux sous-classes le soin de compléter l'implémentation. Si une classe abstraite ne contient que des déclarations de méthodes abstraites, elle doit être déclarée comme une interface à la place.

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

En comparaison, les classes abstraites sont le plus souvent sous-classées pour 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 aussi quelques différences (les méthodes abstraites).

11voto

DanFromGermany Points 7201

De nombreux cas peuvent être mis en œuvre 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 les 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; }
}

7voto

MadProgrammer Points 161522

Il existe un certain nombre de cas où vous pouvez envisager d'utiliser une interface plutôt qu'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 voulez implémenter la fonctionnalité de l'interface

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

5voto

Ravindra babu Points 5571

Avec le support des méthodes par défaut dans les interfaces depuis le lancement de Java 8, l'écart entre interface y abstrait Les classes ont été réduites, mais elles présentent toujours 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 privé, protégé etc.

  2. Les méthodes de l'interface sont public o public statique mais les méthodes de la classe abstraite peuvent être privé y protégé trop

  3. Utilice classe abstraite établir une relation entre des objets interdépendants. Utilisez interface pour établir une relation entre des classes non liées.

Jetez un coup d'œil à ceci article pour les propriétés spéciales de interface dans java 8. le modificateur statique pour les méthodes par défaut dans l'interface provoque une erreur de compilation dans l'erreur dérivée si vous voulez utiliser @override.

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

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

Jetez un coup d'œil à ces questions SE connexes avec un exemple de code pour mieux comprendre les choses :

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

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