Quelle est la différence entre une interface et une classe abstraite?
Quelle est exactement la différence entre une interface et une classe abstraite?
- C'est un très commun de questions de l'entrevue. C'est surprenant, car une classe abstraite est rarement utilisé dans les solutions par rapport à d'autres choses. Votre question m'a aidé Safraz.
- Cette question pourrait également aider à comprendre le concept des interfaces stackoverflow.com/q/8531292/1055241
- J'ai enlevé la balise PHP formulaire à cette question, car aucun de la réponse sont spécifiques à la langue, et la question elle-même n'est pas spécifique à une langue.
- retour dans la journée en c++ une interface est une classe de base abstraite pure avec toutes les implémentations de méthodes = 0. Si une seule méthode n'est pas = 0, alors il a une mise en œuvre et l'abrégé de la base n'est plus pure, et non plus d'une interface. Je pense que le VMT a moins d'indirection lors de l'héritage multiple utilise uniquement abstraite pure de bases, mais je ne me souviens pas de la façon dont ils regardent plus, été trop long.
Vous devez vous connecter pour publier un commentaire.
Interfaces
Une interface est une contrat: La personne qui écrit l'interface dit, "hey, j'accepte les choses à la recherche de cette façon", et la personne à l'aide de l'interface dit "OK, la classe j'écris regarde de cette façon".
Une interface est une coquille vide. Il y a seulement les signatures des méthodes, ce qui implique que les méthodes n'ont pas de corps. L'interface ne peut pas faire n'importe quoi. C'est juste un modèle.
Par exemple (pseudo-code):
Mise en œuvre d'une interface consomme peu de CPU, parce que ce n'est pas une classe, tout un tas de noms, et par conséquent, il n'est pas cher recherche à faire. C'est génial quand il le faut, comme dans les systèmes embarqués.
Les classes abstraites
Les classes abstraites, à la différence des interfaces, sont des classes. Ils sont plus chers à l'usage, car il y a une recherche à faire quand vous en hérite.
Les classes abstraites ressemblent beaucoup à des interfaces, mais ils ont quelque chose de plus: Vous pouvez définir un comportement pour eux. C'est plus sur une personne en disant: "ces classes doit ressembler à cela, et ils ont cela en commun, afin de remplir les blancs!".
Par exemple:
Mise en œuvre
Tandis que les classes abstraites et les interfaces sont censés être différents concepts, les implémentations de faire cette déclaration, parfois faux. Parfois, ils sont même pas ce que vous pensez qu'ils sont.
En Java, cette règle est appliquée rigoureusement, tout en PHP, les interfaces sont des classes abstraites sans méthode déclarée.
En Python, les classes abstraites sont plus d'une programmation astuce vous pouvez obtenir de l'ABC module et est fait à l'aide metaclasses, et donc des classes. Et les interfaces sont plus liées à la duck-typing dans cette langue, et c'est un mélange entre les conventions et les méthodes spéciales qui appellent des descripteurs (l' __méthode__ méthodes).
Comme d'habitude avec la programmation, il y a la théorie, la pratique, et la pratique dans une autre langue 🙂
void break();
? Dans ce cas, toutes les classes de la mise en œuvre de MotorVehicle interface doit fournir une implémentation pour pause() méthode qui nécessite des modifications dans plus d'endroits. N'est-ce pas plus tuer?protected
?interface
etclass
deHead First Java
est éclatante queA class defines who you are, and an interface tells what roles you could play
La clé de différences techniques entre un classe abstraite et un interface sont:
Les classes abstraites peuvent avoir constantes, les membres, la méthode des talons (pour les méthodes sans un corps) et des méthodes définies par l', alors que les interfaces ne peut avoir constantes et méthodes talons.
Des méthodes et des membres d'une classe abstraite peut être défini avec de la visibilité pour la, alors que toutes les méthodes d'une interface doit être défini comme
public
(ils sont publics définis par défaut).Quand hérite d'une classe abstraite, un béton enfant de la classe doit définir les méthodes abstraites, alors qu'une classe abstraite peut étendre une autre classe abstraite et méthodes abstraites de la classe parent n'ont pas à être définis.
De même, une interface étendre l'interface est pas responsable de la mise en œuvre de méthodes à partir de l'interface parent. C'est parce que les interfaces ne peuvent pas définir de toute mise en œuvre.
Un enfant de la classe ne peut étendre une classe unique (abstrait ou concret), alors qu'une interface peut étendre ou une classe peut mettre en œuvre plusieurs autres interfaces.
Un enfant de la classe peut définir des méthodes abstraites avec la même ou moins restrictif de la visibilité, alors qu'une classe implémentant une interface doit définir les méthodes avec la même visibilité (public).
CANNOT
être instancié.Une Interface ne contient que la définition et la signature de la fonctionnalité, et si nous avons certaines fonctionnalités communes, ainsi que des signatures, alors nous avons besoin d'utiliser une classe abstraite. En utilisant une classe abstraite, on peut prévoir le comportement ainsi que des fonctionnalités les deux en même temps. Un autre développeur hériter de la classe abstraite pouvez utiliser cette fonctionnalité facilement, car ils ont besoin pour remplir les blancs.
Tiré de:
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html
http://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html
Une explication peut être trouvée ici: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm
De toute façon je trouve cette explication des interfaces un peu confus. Plus la définition est: une interface définit un contrat de mise en œuvre de classes doivent remplir. Une définition d'interface se compose de signatures de membres du public, sans aucune mise en œuvre du code.
Je ne veux pas mettre en évidence les différences, qui ont été déjà dit dans plusieurs réponses ( concernant le public static final modificateurs pour les variables de l'interface & soutien à l'protégé, privé des méthodes dans les classes abstraites)
En termes simples, je voudrais dire:
interface: À l'exécution d'un contrat par de multiples objets indépendants
classe abstraite: Pour mettre en œuvre les mêmes ou différents comportements entre plusieurs objets liés à l'
De l'Oracle la documentation
Envisager l'utilisation de classes abstraites si :
Envisager d'utiliser des interfaces si :
Serializable
interface.classe abstraite établit "est une" relation avec les classes de béton. l'interface fournit "a une" capacité pour les classes.
Si vous êtes à la recherche pour
Java
comme langage de programmation, voici quelques mises à jour:Java 8 a réduit l'écart entre
interface
etabstract
classes dans une certaine mesure, en fournissant undefault
fonctionnalité de méthode. Une interface ne dispose pas d'une mise en œuvre d'une méthode n'est plus valable aujourd'hui.Référence à cette documentation page pour plus de détails.
Jetez un oeil à cette question SE pour des exemples de code pour mieux comprendre.
Comment dois-je avoir expliqué la différence entre une Interface et une classe Abstraite?
Quelques différences importantes:
Sous la forme d'un tableau:
Comme l'a déclaré Joe de javapapers:
Le point principal est que:
Lorsque vous souhaitez fournir polymorphes comportement dans une hiérarchie d'héritage, l'utilisation de classes abstraites.
Quand vous voulez polymorphes comportement pour les classes qui n'ont aucun rapport avec, l'utilisation d'une interface.
Je suis la construction d'un bâtiment de 300 étages
La construction du plan interface
Bâtiment construit jusqu'à 200 étages - partiellement complété---résumé
De construction de l'immeuble terminée-béton
Interface
aller pour une interface.
Résumé
Prises de DurgaJobs Site
Nous allons travailler sur cette question encore une fois:
La première chose pour vous permettre de savoir, c'est que 1/1 et 1*1 résultats dans la même, mais cela ne signifie pas que la multiplication et la division sont les mêmes. De toute évidence, ils détiennent une certaine relation est bonne, mais l'esprit que vous les deux sont différents.
Je ferai remarquer principales différences, et le reste a déjà été expliqué:
Les classes abstraites sont utiles pour la modélisation d'une hiérarchie de classe. Au premier coup d'œil, de toute nécessité, nous sommes partiellement clair sur ce que exactement est à construire, mais nous savons ce que à construire. Et si vos classes abstraites sont vos classes de base.
Interfaces sont utiles pour permettre à d'autres de hiérarchie ou de classes sais que ce que je suis capable de faire. Et quand vous dites que je suis capable de quelque chose, vous devez avoir la capacité. Interfaces sera obligatoire pour une classe pour mettre en œuvre les mêmes fonctionnalités.
C'est assez simple en fait.
Vous pouvez penser à une interface d'une classe qui n'est permis d'avoir des méthodes abstraites et rien d'autre.
Donc une interface ne peut "déclarer" et de ne pas définir le comportement que vous souhaitez le cours.
Une classe abstraite permet de faire déclarer (à l'aide de méthodes abstraites) ainsi que de définir (en utilisant la méthode complète implémentations) le comportement que vous souhaitez le cours.
Et une classe ordinaire ne permet de définir, de ne pas déclarer, le comportement/les actions que vous souhaitez que la classe d'avoir.
Une dernière chose,
En Java, on peut implémenter plusieurs interfaces, mais vous ne pouvez étendre un (Classe Abstraite ou une Classe)...
Cela signifie l'héritage de comportement défini est limité à un seul par classe... c'est à dire que si tu voulais une classe que encapsulé comportement de Classes A,B&C, vous aurez besoin de faire le suivant: Class A extends B, Classe C extends A .. c'est un peu un tour sur moyen d'avoir de l'héritage multiple...
Interfaces d'autre part, vous pouvez tout simplement faire: interface C implémente A, B
Donc en effet Java supporte l'héritage multiple, seule en "a déclaré le problème" ie interfaces, et seulement de l'héritage simple avec comportement défini.. à moins que vous ne le rond-point chemin que j'ai décrit...
J'espère que ça a du sens.
La comparaison de l'interface vs classe abstraite est faux. Il devrait y avoir deux autres comparaisons à la place: 1) interface vs classe et 2) abstrait vs finale de la classe.
Interface vs Classe
Interface est un contrat entre deux objets. E. g., Je suis un Postier et vous êtes un Paquet à livrer. Je vous attends pour connaître votre adresse de livraison. Quand quelqu'un me donne un Paquet, il doit connaître son adresse de livraison:
Classe est un groupe d'objets qui obéissent le contrat. E. g., Je suis une boîte de "Boîte" du groupe et j'obéis du contrat par le Facteur. En même temps, je obéir à d'autres contrats:
Abstrait vs Final
Classe abstraite est un groupe d'objets incomplets. Ils ne peuvent pas être utilisés, car ils manquent certaines parties. E. g., Je suis un résumé GPS-courant fort - je savoir comment faire pour vérifier ma position sur la carte:
Cette classe, si hérité prolongée par une autre classe, peut être très utile. Mais par lui-même - c'est inutile, car il ne peut pas avoir des objets. Les classes abstraites peuvent être les éléments de construction de finale de classes.
Classe finale est un groupe d'objets, qui peuvent être utilisés, mais ne peut pas être modifié. Ils savent exactement comment travailler et quoi faire. E. g., Je suis une Boîte qui va toujours à l'adresse indiquée lors de sa construction:
Dans la plupart des langages, comme Java ou C++, il est possible d'avoir juste une classe, ni abstrait, ni définitive. Une telle classe peut être héréditaire et peut être instancié. Je ne pense pas que c'est strictement en ligne avec le paradigme orienté objet, si.
Encore une fois, la comparaison des interfaces avec les classes abstraites n'est pas correct.
La seule différence est que l'on peut participer à l'héritage multiple et d'autres ne le peuvent pas.
La définition d'une interface a changé au fil du temps. Pensez-vous qu'une interface a juste des déclarations de méthode, seulement et seulement contrats? Qu'en est statique de la finale de variables et ce sur les définitions par défaut après Java 8?
Interfaces ont été introduits à Java en raison de le diamant problème de l'héritage multiple et c'est ce qu'ils ont réellement l'intention de le faire.
Interfaces sont les constructions qui ont été créés à partir avec l'héritage multiple problème et peut avoir des méthodes abstraites, les définitions par défaut et statique de la finale de variables.
Voir Pourquoi Java permettent static final variables dans les interfaces quand ils sont uniquement destinées à des contrats?.
En bref, les différences sont les suivantes:
Syntaxique Différences Entre Interface et Classe Abstraite:
Dans les Interfaces maintenant:
public static
- pris en chargepublic abstract
- pris en chargepublic default
- pris en chargeprivate static
- pris en chargeprivate abstract
- erreur de compilationprivate default
- erreur de compilationprivate
- pris en chargeInterface: Tourner ( Tourner À Gauche, Tourner À Droite.)
Classe Abstraite: La Roue.
Catégorie: Volant, dérive de la Roue, expose l'Interface
Est pour catégoriser les comportements qui peuvent être offerts dans un éventail diversifié de choses, l'autre est pour la modélisation d'une ontologie de choses.
Si vous avez quelques méthodes qui peuvent être utilisées par plusieurs classes d'aller pour les classes abstraites.
Sinon si vous voulez les classes de suivre un certain schéma directeur go pour les interfaces.
Exemples suivants illustrent cette.
Classe abstraite Java:
Qui suit est une implémentation de l'interface en Java:
Certains des points Clés Importants en un mot:
Les variables déclarées dans l'interface Java sont, par défaut, final. Les classes abstraites peuvent avoir des non-final variables.
Les variables déclarées dans l'interface Java sont par défaut statique. Les classes abstraites peuvent avoir des variables statiques.
Les membres d'une interface Java sont publics par défaut. Une classe abstraite Java peut avoir l'habitude des saveurs de membres de la classe comme private, protected, etc..
Pas vraiment la réponse à la question d'origine, mais une fois que vous avez la réponse à la différence entre eux, vous entrez dans la lorsque-pour-utiliser-chaque dilemme:
Quand utiliser des interfaces ou des classes abstraites? Quand utiliser les deux?
J'ai une connaissance limitée de la programmation orientée objet, mais en voyant les interfaces comme un équivalent de l'adjectif dans la grammaire a fonctionné pour moi jusqu'à maintenant (corrigez-moi si cette méthode est faux!). Par exemple, les noms d'interface sont comme des attributs ou des fonctionnalités que vous pouvez donner à une classe, et une classe peut avoir plusieurs d'entre eux: ISerializable, ICountable, IList, ICacheable, IHappy, ...
L'héritage est utilisé à deux fins:
Pour permettre à un objet à l'égard des parents membres de données de type et méthode d'implémentations de sa propre.
Afin de permettre une référence à un objet d'un type à être utilisé par le code, qui prévoit que la référence à supertype objet.
Dans des langues/des cadres de l'appui généralisé de l'héritage multiple, il y a souvent peu de nécessité de classer un type comme étant une "interface" ou une "classe abstraite". Langues populaires et les cadres, cependant, permettra à un type à l'égard d'un autre type de données membres et les implémentations de méthodes comme son propre, même si elles permettent à un type d'être substituables pour un nombre arbitraire d'autres types.
Les classes abstraites peuvent disposer de données membres et les implémentations de méthode, mais ne peuvent être héritées par les classes qui n'héritent pas de n'importe quelle autre classe. Les Interfaces de mettre presque pas de restrictions sur les types qui sont à mettre en œuvre, mais ne peut pas inclure tous les membres de données ou la méthode mise en œuvre.
Il y a des moments où c'est utile pour les types de substituables pour beaucoup de choses différentes; il y a d'autres fois où c'est utile pour les objets à l'égard des parents membres de données de type et méthode d'implémentations de leur propre. Faire une distinction entre les interfaces et les classes abstraites, permet à chacun de ces capacités à être utilisé dans les cas où il est le plus pertinent.
Points Clés:
incomplète) à la fois.
la fonctionnalité)
propriétés et qui doit l'emporter dans la classe dérivée.
Avantage:
trouver les détails ici...
http://pradeepatkari.wordpress.com/2014/11/20/interface-and-abstract-class-in-c-oops/
Le chemin le plus court pour résumer, c'est qu'une
interface
est:default
etstatic
méthodes; alors qu'il a des définitions (signatures de méthode + implémentations) pourdefault
etstatic
méthodes, il a seulement des déclarations (signatures de méthode) pour les autres méthodes.interface
s, et uninterface
peut hériter de plusieursinterface
s). Toutes les variables sont implicitement constante, qu'il soit spécifié quepublic static final
ou pas. Tous les membres sont implicitementpublic
, si spécifié comme tel ou non.Pendant ce temps, un
abstract
classe est:abstract
méthodes. Peut contenir deux déclarations et les définitions, avec des déclarations marqué commeabstract
.protected
,private
, ou colis privés (non spécifiés).Ou, si nous voulons faire bouillir le tout vers le bas à une seule phrase: Un
interface
est ce que la mise en œuvre de la classe a, mais unabstract
classe est ce que la sous-classe est.Je voudrais ajouter encore une différence qui fait sens.
Par exemple, vous avez un cadre avec des milliers de lignes de code. Maintenant, si vous voulez ajouter une nouvelle fonctionnalité dans le code à l'aide d'une méthode enhanceUI(), alors il est préférable d'ajouter que la méthode dans la classe abstraite plutôt dans l'interface. Parce que, si vous ajoutez cette méthode dans une interface, alors vous devriez le mettre en œuvre dans toutes les mises en œuvre de la classe, mais ce n'est pas le cas si vous ajoutez la méthode dans la classe abstraite.
Pour donner un simple mais de réponse claire, il permet de définir le contexte : vous utilisez à la fois lorsque vous ne voulez pas donner la pleine mise en œuvre.
La principale différence est qu'une interface n'a pas d'application à tous les (seules les méthodes sans corps), tandis que les classes abstraites peuvent avoir des membres et des méthodes avec un corps aussi bien, c'est à dire peut être que partiellement mises en œuvre.
default
mot-clé dans Java 8 avec laquelle vous pouvez définir les modalités concrètes d'interfaces ainsi.Différences entre l'abstrait classe et d'interface pour le compte de la réelle mise en œuvre.
Interface: C'est un mot-clé et il est utilisé pour définir le modèle ou le bleu de l'impression d'un objet et il les forces, toutes les sous classes de suivre le même prototype,pour ce qui est de la mise en œuvre, toutes les sous-classes sont libres de mettre en œuvre les fonctionnalités selon que c'est la condition.
Certains à d'autres cas où l'on doit utiliser l'interface.
De Communication entre deux objets externes(Tiers de l'intégration dans notre application) fait par le biais de Interface ici, l'Interface fonctionne comme un Contrat.
Classe abstraite: Résumé,c'est un mot-clé et lorsque nous utilisons ce mot-clé devant toute la classe, puis il devient classe abstraite.Il est principalement utilisé lorsque nous avons besoin de définir le modèle ainsi que certaines fonctionnalités par défaut d'un objet qui est suivie par tous les sous-classes et de cette manière, il supprime le code redondant et un plus les cas d'utilisation où nous pouvons utiliser la classe abstraite, comme nous ne voulons pas d'autres classes peuvent directement instancier un objet de la classe, seulement les classes dérivées peuvent utiliser la fonctionnalité.
Exemple de Classe Abstraite:
Exemple De L'Interface:
Vous pouvez trouver de différence claire entre les interface et classe abstraite.
Interface
interfaces.
Classe abstraite
Classe abstraite contient abstrait et non des méthodes abstraites.
Ne pas forcer les utilisateurs à mettre en œuvre toutes les méthodes héritées de la
la classe abstraite.
Contient tous les types de variables, y compris primitive et non primitif
Déclarer à l'aide de mot clé abstract.
Des méthodes et des membres d'une classe abstraite peut être défini avec tout
la visibilité.
Un enfant de la classe ne peut étendre qu'une seule classe (abstraite ou concrète).
Beaucoup les développeurs juniors font l'erreur de penser des interfaces, concrètes et abstraites les classes en tant que de légères variations de la même chose, et de choisir l'un d'eux purement pour des raisons techniques: ai-je besoin de l'héritage multiple? Ai-je besoin d'un endroit pour mettre les méthodes courantes? Dois-je m'inquiéter d'autre chose que juste un béton de classe? C'est faux, et caché dans ces questions est le problème principal: "je". Lorsque vous écrivez du code pour vous-même, par vous-même, il est rare de penser à d'autres, présents ou futurs développeurs travaillant sur ou avec votre code.
Les Interfaces et les classes abstraites, mais apparemment similaires d'un point de vue technique, ont un sens complètement différent et fins.
Résumé
Une interface définit un contrat que certains de la mise en œuvre permettra de remplir pour vous.
Une classe abstraite fournit un comportement par défaut que votre mise en œuvre pouvez réutiliser.
Alternative résumé
Sur l'importance de cacher les détails de mise en œuvre
Une classe concrète le travail réel, d'une façon très spécifique. Par exemple, un
ArrayList
utilise un espace contigu de mémoire pour stocker une liste d'objets dans un compact manière qui offre accès aléatoire rapide, l'itération, et les modifications en place, mais elle est terrible à des insertions, des suppressions et parfois même des ajouts; pendant ce temps, unLinkedList
utilise double-nœuds liés à stocker une liste d'objets, ce qui offre plutôt rapide itération, modifications en place, et à l'insertion/suppression/ajout, mais elle est terrible à accès aléatoire. Ces deux types de listes sont optimisés pour différents cas d'utilisation, et cela compte beaucoup comment vous allez les utiliser. Lorsque vous essayez de serrer de performance d'une liste de ce que vous êtes fortement en interaction avec, et lors de la prise du type de liste est à vous, vous devez soigneusement choisir celui qui vous avez de l'instanciation.D'autre part, le niveau élevé des utilisateurs de la liste ne vous souciez pas vraiment comment il est réellement mis en œuvre, et ils devraient être isolés à partir de ces détails. Imaginons que Java ne pas exposer le
List
interface, mais seulement eu un bétonList
classe qui est en fait ce queLinkedList
est maintenant. Tous Java, les développeurs ont adapté leur code pour l'adapter les détails de mise en œuvre: éviter d'accès aléatoire, ajouter un cache pour accélérer l'accès, ou tout simplement ré-écrireArrayList
sur leur propre, bien que ce serait incompatible avec tout autre code qui fonctionne réellement avecList
seulement. Ce serait terrible... Mais maintenant, imaginez que le Java maîtres en fait de réaliser qu'une liste chaînée est terrible pour la plupart des cas d'utilisation réels, et a décidé de passer à la liste du réseau pour leur seulList
classe disponible. Cela aurait un impact sur les performances de chaque programme Java dans le monde, et les gens ne seraient pas heureux à ce sujet. Et le principal coupable est que la mise en œuvre de détails étaient disponibles, et les développeurs de supposer que ces détails sont d'un contrat permanent qu'ils peuvent compter sur. C'est pourquoi il est important de cacher les détails d'implémentation, et de se contenter de définir un résumé du contrat. C'est le but d'une interface: définir le type de saisie d'une méthode accepte, et ce type de sortie est prévu, sans s'exposer à tous les tripes qui pousserait les programmeurs de peaufiner leur code pour s'adapter à l'intérieur les détails qui pourraient changer à l'avenir toute mise à jour.Une classe abstraite est au milieu entre les interfaces et les classes concrètes. Il est censé aider les implémentations en commun ou du code ennuyeux. Par exemple,
AbstractCollection
fournit des implémentations pourisEmpty
basé sur la taille est de 0,contains
comme itérer et de comparer,addAll
, comme on le répèteadd
, et ainsi de suite. Cela permet des implémentations de se concentrer sur les éléments essentiels qui différencient entre eux: comment stocker et récupérer des données.Api rapport SPIs
Interfaces sont de faible cohésion passerelles entre les différentes parties de code. Ils permettent aux bibliothèques d'exister et d'évoluer sans rupture de toutes les bibliothèques de l'utilisateur lorsque quelque chose change en interne. Il est appelé de Programmation d'Application Interface, pas de Programmation d'Application des Classes. Sur une plus petite échelle, ils permettent aussi à de nombreux développeurs de collaborer avec succès sur des projets à grande échelle, en séparant les différents modules à travers des interfaces documentées.
Les classes abstraites sont de haute cohésion aides à être utilisé lors de la mise en œuvre d'une interface, en supposant un niveau de détails de mise en œuvre. Sinon, les classes abstraites sont utilisés pour la définition des Zips, Fournisseur de Services d'Interfaces.
La différence entre un API et un SPI est subtile, mais importante: pour une API, l'accent est mis sur qui utilise, et pour un SPI l'accent est mis sur qui implémente il.
Ajouter des méthodes à une API est facile, tous les utilisateurs de l'API seront encore de la compilation. Ajouter des méthodes à une SPI est difficile, car chaque fournisseur de services (mise en œuvre concrète) devra mettre en œuvre de nouvelles méthodes. Si les interfaces sont utilisées pour définir un SPI, un fournisseur de sortir une nouvelle version à chaque fois que le SPI de modifications de contrat. Si les classes abstraites sont utilisés au lieu de cela, de nouvelles méthodes pourraient être définis dans le plan des méthodes abstraites, ou comme vide
throw not implemented exception
talons, ce qui permettra au moins d'une version plus ancienne d'un service de la mise en œuvre de toujours compiler et exécuter.Une remarque sur Java 8 et méthodes par défaut
Bien que Java 8 introduit des méthodes par défaut pour les interfaces, ce qui rend la ligne entre les interfaces et les classes abstraites même de plus en plus floue, ce n'était pas, de sorte que les implémentations pouvez réutiliser le code, mais pour le rendre plus facile de changer les interfaces qui servent à la fois comme une API et un SPI (ou sont mal utilisés pour la définition de SPIs au lieu de classes abstraites).
Laquelle utiliser?
Un corollaire: l'inverse est souvent, à tort, fait: lors de l'utilisation d'un chose, essayez toujours d'utiliser la plupart des génériques de la classe/de l'interface que vous avez réellement besoin. En d'autres termes, de ne pas déclarer vos variables comme
ArrayList theList = new ArrayList()
, sauf si vous avez une très forte dépendance à l'égard étant un tableau liste, et aucun autre type de liste de le couper pour vous. UtilisationList theList = new ArrayList
au lieu de cela, ou mêmeCollection theCollection = new ArrayList
si le fait que c'est une liste, et pas n'importe quel autre type de collection n'est pas vraiment de l'importance.Une classe abstraite est une classe dont l'objet ne peut pas être créée ou une classe qui ne peut pas être instanciée.
Une méthode abstraite fait une classe abstraite.
Une classe abstraite doit être héréditaire, afin de remplacer les méthodes qui sont déclarées dans la classe abstraite.
Pas de restriction sur les spécificateurs d'accès.
Une classe abstraite peut avoir de constructeur et d'autres béton(non abstarct méthodes ) méthodes en eux, mais l'interface ne peut pas avoir.
Une interface est un modèle/modèle de méthodes.(eg. Une maison sur un document donné(interface interne) et les différents architectes utilisent leurs idées pour construire(les classes des architectes de la mise en œuvre de la maison de l'interface) .
C'est une collection de méthodes abstraites , méthodes par défaut , les méthodes statiques , finale des variables et des classes imbriquées.
Tous les membres seront finale ou public , privé et protégé spécificateurs d'accès ne sont pas autorisés.Pas de création d'objet est autorisé.
Une classe doit être faite pour l'utilisation de la mise en œuvre de l'interface et aussi pour remplacer la méthode abstraite déclarées dans l'interface. Une interface est un bon exemple de couplage lâche(polymorphisme dynamique/liaison dynamique)
Une interface met en œuvre le polymorphisme et l'abstraction.Il dit quoi faire, mais la façon de le faire est défini par la mise en œuvre de la classe.
Pour Eg. Il y a une voiture de société et il veut que certaines caractéristiques pour être la même pour toutes les voitures, il est de fabrication donc, pour que la société serait de faire une interface de véhicule qui ont ces caractéristiques et les différentes classes de la voiture(comme Maruti Suzkhi , Maruti 800) remplacent celles caractéristiques(fonctions).
Pourquoi interface quand on a déjà la classe abstraite?
Java prend en charge uniquement les multiniveau et hiérarchique de l'héritage, mais avec l'aide de l'interface, nous pouvons mettre en œuvre l'héritage multiple.
Dans une interface toutes les méthodes doivent être uniquement des définitions, pas un seul devrait être mis en œuvre.
Mais dans une classe abstraite, il faut une méthode abstraite avec une seule définition, mais d'autres méthodes peuvent également être dans la classe abstraite avec la mise en œuvre...
généralement de la classe Abstraite utilisée pour la base de quelque chose, mais l'interface utilisée pour l'ajout de périphériques.
lorsque vous souhaitez créer un type de base pour le véhicule, vous devez utiliser la classe abstraite mais si vous voulez ajouter certaines fonctionnalités ou des biens qui ne fait pas partie de la base de la notion de véhicule, vous devez utiliser l'interface,par exemple, vous voulez ajouter "la méthode ToJSON()" fonction.
interface possède une large gamme d'abstraction plutôt que de la classe abstraite.
vous pouvez le voir dans le passage d'arguments.regardez cet exemple:
si vous utilisez le véhicule comme argument, vous ne pouvez utiliser l'un de ses dérivés de type (bus ou voiture de même catégorie-seulement la catégorie de véhicule).
mais lorsque vous utilisez IMoveable interface comme argument que vous avez plus de choix.
Un simple mais efficace, l'explication de la classe abstraite et une interface sur php.net:
Dans la pratique, les termes(JAVA), la différence majeure entre une classe abstraite et l'interface est
Classe abstraite peut contenir de l'état.
Autre que la détention de l'état, nous pouvons réaliser des opérations rest avec Interface aussi.
Voici un très compréhension de base sur l'interface vs classe abstraite.
Interfaces sont généralement les classes sans logique juste une signature. Alors que les classes abstraites sont ceux qui disposent de la logique. Les deux contrat de soutien en tant qu'interface de méthode doit être mis en œuvre dans la classe enfant, mais en résumé seulement la méthode abstraite doit être mis en œuvre. Quand à utiliser l'interface et quand abstrait? Pourquoi utiliser l'Interface?
Nous voudrions simplement faire
Quelques jours plus tard, nous aurions besoin de l'aire du rectangle, le Carré, le Quadrilatère et ainsi de suite. Si oui, devons-nous changer le code à chaque fois et de vérifier si l'instance est de carré ou un cercle ou un rectangle? Maintenant, ce que l'OCP dit que c'est le CODE D'UNE INTERFACE NON de mise en ŒUVRE.
La Solution serait:
Maintenant pour calculateur de zone
N'est pas plus flexible? Si nous voulons code sans interface nous permettrait de contrôler l'instance pour chaque forme de code redondant.
Maintenant quand utiliser abstrait?
Désormais abrégé doit être utilisée lorsque l'on n'a pas besoin d'instance de cette classe, ayant la même logique, avoir besoin pour le contrat.
Nous avons différentes structures ou de syntaxe différence entre l'interface et la classe abstraite. Certains plus de différences sont
[1] Scénario de différence:
Les classes abstraites sont utilisés dans les scénarios quand nous voulons nous limiter à l'utilisateur de créer un objet de la classe parente, ET nous croyons qu'il y aura plus de méthodes abstraites seront ajoutés dans le futur.
Interface doit être utilisé lorsque nous sommes sûr qu'il y a peut-être pas plus méthode abstraite de gauche à fournir. Alors seulement une interface est publié.
[2] différence Conceptuelle:
"Nous devons fournir plus abstrait des méthodes à l'avenir" si OUI, il classe abstraite et si PAS de faire de l'Interface.
(Plus approprié et valide jusqu'java 1.7)
L'idée générale de classes abstraites et des interfaces, est prolongée/mis en œuvre par d'autres classes (ne construit pas seul) qui utilisent ces "paramètres" (une sorte de modèle), il est donc simple de définir un-comportement général pour tous les objets tard le prolonger.
Une classe abstraite a régulièrement des méthodes ET des méthodes abstraites. Étendue classes peuvent inclure unset méthodes après avoir été prolongée par une classe abstraite. Lors de la définition de méthodes abstraites - ils sont définis par les classes qui sont en l'étendant plus tard.
Interfaces ont les mêmes propriétés qu'une classe abstraite, mais ne comprend que des méthodes abstraites, qui pourrait être mis en œuvre dans une autre classe/es (et peut-être plus d'une interface à implémenter), ce qui crée un plus permanent-solide definishion de méthodes/variables statiques. À la différence de la classe abstraite, vous ne pouvez pas ajouter des "réguliers" des méthodes.