Héritage
Considérez une voiture et un bus. Ce sont deux véhicules différents. Mais encore, ils partagent certaines propriétés communes comme ils ont une direction, des freins, des engrenages, un moteur, etc.
Donc, avec le concept d'héritage, cela peut être représenté comme suit ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
Maintenant un vélo ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
Et une voiture ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
C'est tout sur l' héritage . Nous les utilisons pour classer les objets dans des formes de base plus simples et leurs enfants comme nous l'avons vu ci-dessus.
Classes abstraites
Les classes abstraites sont des objets incomplets . Pour mieux comprendre, considérons à nouveau l'analogie avec le véhicule.
Un véhicule peut être conduit. Droite? Mais différents véhicules sont conduits de différentes manières ... Par exemple, vous ne pouvez pas conduire une voiture comme vous conduisez un vélo.
Alors, comment représenter la fonction de conduite d'un véhicule? Il est plus difficile de vérifier de quel type de véhicule il s'agit et de le conduire avec sa propre fonction; vous devrez changer la classe Driver encore et encore lors de l'ajout d'un nouveau type de véhicule.
Voici le rôle des classes et méthodes abstraites. Vous pouvez définir la méthode de lecteur comme abstraite pour indiquer que tous les enfants hérités doivent implémenter cette fonction.
Donc, si vous modifiez la classe du véhicule ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
Le vélo et la voiture doivent également spécifier comment le conduire. Sinon, le code ne se compilera pas et une erreur est générée.
En bref .. une classe abstraite est une classe partiellement incomplète avec des fonctions incomplètes, que les enfants héritiers doivent spécifier les leurs.
Interfaces Les
interfaces sont totalement incomplètes. Ils n'ont aucune propriété. Ils indiquent simplement que les enfants héritiers sont capables de faire quelque chose ...
Supposons que vous ayez différents types de téléphones portables avec vous. Chacun d'eux a différentes façons de remplir différentes fonctions; Ex: appeler une personne. Le fabricant du téléphone précise comment le faire. Ici, les téléphones mobiles peuvent composer un numéro - c'est-à-dire qu'il est capable de composer. Représentons cela comme une interface.
public interface Dialable {
public void dial(Number n);
}
Ici, le fabricant du Dialable définit comment composer un numéro. Il vous suffit de lui donner un numéro à composer.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
En utilisant des interfaces au lieu de classes abstraites, l'auteur de la fonction qui utilise un Dialable n'a pas à se soucier de ses propriétés. Ex: a-t-il un écran tactile ou un pavé numérique, s'agit-il d'un téléphone fixe ou d'un téléphone portable. Vous avez juste besoin de savoir s'il est numérotable; hérite-t-il (ou implémente-t-il) l'interface Dialable?
Et plus important encore , si un jour vous changez le Dialable avec un autre
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Vous pouvez être sûr que le code fonctionne toujours parfaitement car la fonction qui utilise le dialable ne dépend pas (et ne peut pas) dépendre de détails autres que ceux spécifiés dans l'interface Dialable. Ils implémentent tous les deux une interface Dialable et c'est la seule chose dont la fonction se soucie.
Les interfaces sont couramment utilisées par les développeurs pour garantir l'interopérabilité (à utiliser de manière interchangeable) entre les objets, dans la mesure où ils partagent une fonction commune (tout comme vous pouvez passer à une ligne fixe ou à un téléphone mobile, dans la mesure où vous n'avez qu'à composer un numéro). En bref, les interfaces sont une version beaucoup plus simple des classes abstraites, sans aucune propriété.
Notez également que vous pouvez implémenter (hériter) autant d'interfaces que vous le souhaitez mais vous ne pouvez étendre (hériter) qu'une seule classe parent.
Plus d'informations
Classes abstraites vs interfaces