Quand dois-je utiliser des interfaces au lieu de classes abstraites? [dupliquer]
cette question a déjà une réponse ici:
- classe Abstraite vs Interface en Java 14 réponses
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
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é)
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.
De la Oracle "tutoriels 151960920" :
Contrairement aux interfaces, les classes abstraites peuvent contenir des champs qui ne sont pas static
et final
, et ils peuvent contenir des méthodes implémentées. Ces classes abstraites sont similaires aux interfaces, sauf qu'elles fournissent une implémentation partielle, laissant aux sous-classes le soin d'achever l'implémentation. Si une classe abstraite ne contient que des déclarations de méthode abstraite, elle devrait être déclaré comme une interface à la place.
les interfaces multiples 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 de quelque manière que ce soit. Pensez à Comparable
ou Cloneable
, par exemple.
par comparaison, les classes abstraites sont le plus souvent subdivisées pour partager des pièces d'implémentation . Une seule classe abstraite est subdivisée par des classes similaires qui: ont beaucoup en commun (les parties mises en œuvre de la classe abstraite), mais ont aussi quelques différences (les méthodes abstraites).
de nombreux cas peuvent être implémentés dans les deux types de classes.
Les Interfacessont 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; }
}
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
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.
-
les Variables dans l'interface sont public static final . Mais classe abstraite peut avoir d'autres types de variables comme privé, protégé etc
-
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
-
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?
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:
- vous voulez partager le code entre plusieurs classes étroitement liées.
- 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é).
- 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:
- 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.
- 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.
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.
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.
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.
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.
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
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 abstraiten'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...
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
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""
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.
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.
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.
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.
j'ai trouvé cette très bonne explication ici espérer qu'il aide quelqu'un. lire ici
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.
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.