Les classes abstraites ont à la fois une fonction concrète et abstraite. l'interface n'a que des fonctions abstraites.
Le dépassement est possible dans les deux cas. Est-ce
Quel est l'avantage en temps réel de l'un sur l'autre?
Les interfaces sont pour quand vous voulez dire "je ne me soucie pas de la façon dont vous le faites, mais voici ce que vous devez faire."
Les classes abstraites sont pour quand vous voulez dire "Je sais ce que vous devriez faire, et je sais comment vous devriez le faire dans certains cas."
Les classes abstraites présentent de sérieux inconvénients. Par exemple:
class House {
}
class Boat {
}
class HouseBoat extends /* Uh oh!! */ {
// don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}
Vous pouvez passer via une interface:
interface Liveable {
}
interface Floatable {
}
class HouseBoat implements Liveable, Floatable {
}
Maintenant, les classes abstraites sont également très utiles. Par exemple, considérons la classe AbstractCollection. Il définit le comportement par défaut des méthodes très courantes pour toutes les collections, telles que isEmpty()
et contains(Object)
. Vous pouvez remplacer ces comportements si vous le souhaitez, mais ... le comportement permettant de déterminer si une collection est vide risque-t-il vraiment de changer? Typiquement, ça va être size == 0
.
Et comme cela ne changera pas souvent, vaut-il vraiment la peine au développeur de mettre en œuvre cette méthode à chaque ... temps ... individuel ... pour chaque méthode de cette catégorie "résolue"? Sans parler du fait que lorsque vous devez apporter des modifications, vous obtiendrez une duplication de code et des bugs manqués si vous deviez le réimplémenter partout.
Les interfaces sont utiles car Java ne possède pas d'héritage multiple (mais vous pouvez implémenter autant d'interfaces que vous le souhaitez).
Les classes abstraites sont utiles lorsque vous avez besoin d'un comportement concret de la classe de base.
Les faits sont-
Ces faits peuvent être utilisés pour faire pencher l’avantage en faveur d’interfaces ou de classes abstraites.
S'il existe plus d'un comportement qu'une classe doit partager avec d'autres classes, les interfaces gagnent. Si une définition de méthode doit être partagée/remplacée par d'autres classes, les classes abstraites gagnent.
Dans OOP (généralement indépendant d'un langage concret), les classes abstraites constituent un mécanisme de réutilisation de la hiérarchie de classes pour un comportement et une structure incomplète en soi. Les interfaces sont un mécanisme permettant spécification des exigences sur un module (par exemple, une classe) indépendamment de la mise en œuvre concrète. Toutes les autres différences sont des détails techniques, un usage différent est important.
Une classe peut implémenter plusieurs interfaces , alors qu'elle ne peut que étendre une classe (abstraite ou concrète), car Java ne prend pas en charge l'héritage multiple.
Les principaux avantages de l'interface par rapport à la classe abstraite sont de surmonter l'occurrence du problème de diamant Et d'obtenir un héritage multiple. En Java, aucune solution n'est fournie pour le problème de diamant qui utilise des classes. bloquer en utilisant des classes en Java. Nous utilisons donc interface pour obtenir un héritage multiple.
Vous ne remplacez pas une interface. Vous l'implémentez.
L'écriture d'une interface donne aux développeurs la possibilité d'implémenter votre interface ainsi que d'autres interfaces en plus d'hériter d'une classe de base.
Les classes abstraites peuvent être partiellement ou totalement implémentées. Le marquage d'un résumé de classe vous empêche simplement d'instancier un objet de ce type.
class Animal
{ void move(){} }
class Bird
{ void move(){fly} }
class Fish
{ void move(){swim} }
Maintenant, si la classe Animal est une classe abstraite comme
Animal a;
a= new Bird(); or a = new Fish()
Ici, l'abstraction fonctionne bien, mais s'il y a 100 objets comme Animal a[100]
;
Vous ne pouvez pas écrire new Bird().move
ou new Fish().move
100 fois
Utilisez l'interface et écrivez a[i].move
. Il se différenciera en oiseau ou en poisson et que move()
sera invoqué
Deuxièmement, il prend en charge plusieurs héritages, car la classe A
peut implémenter autant d’interfaces.
-Method sans aucune implémentation est une méthode abstraite, chaque fois qu'une classe contient une ou plusieurs méthodes abstraites, elle doit être déclarée en tant que classe abstraite.
-Interface est totalement abstraite et ne peut pas avoir de constructeur, d'instance et de blocs statiques. Elle ne contient que deux types de membres 1. méthode publique abstraite 2.public-static-final
* Les deux ne peuvent pas être instanciés mais une référence peut être créée.
* Ce qui convient le mieux dépend de l'application - Les interfaces sont utiles car les classes Java ne prendront pas en charge l'héritage multiple, mais les interfaces le font.
-Les classes abstraites sont utiles lorsque vous avez besoin d'un comportement concret de la classe de base.