Concepts de POO pour les débutants : le polymorphisme expliqué
Publié: 2021-12-10Dans les langages de haut niveau tels que Python et Java, la POO ou la programmation orientée objet fait référence à l'organisation de la conception logicielle autour des données et des objets plutôt qu'à la logique et aux fonctions. Un objet est défini comme un champ de données avec des attributs et un comportement uniques. En d'autres termes, la POO se concentre sur les objets plutôt que sur la logique. Un tel modèle de programmation est idéal pour les programmes volumineux et complexes nécessitant des mises à jour et une maintenance actives. De plus, il apporte à la table les avantages supplémentaires de l'évolutivité, de l'efficacité et de la réutilisation du code.
La POO a quatre blocs de construction fondamentaux : le polymorphisme, l'encapsulation, l'abstraction et l'héritage. Étant donné que la portée de notre article est limitée au polymorphisme dans les POO, nous discuterons du polymorphisme en détail, y compris des exemples de polymorphisme en Java et de polymorphisme en Python.
Apprenez des cours de logiciels en ligne dans les meilleures universités du monde. Gagnez des programmes Executive PG, des programmes de certificat avancés ou des programmes de maîtrise pour accélérer votre carrière.
Table des matières
Définition du polymorphisme
La définition la plus simple du polymorphisme serait que le polymorphisme signifie exister sous diverses formes. Il a ses racines dans deux termes grecs - « poly », qui signifie « nombreux » et « morph », qui se traduit par « formes ».
Pour mieux comprendre le concept, prenons d'abord un exemple simple. Prenons l'exemple du comportement du curseur, le même curseur que vous voyez se déplacer sur l'écran chaque fois que vous utilisez une souris ou un trackpad. Selon les actions de l'utilisateur ou le mode du programme, le curseur peut prendre différentes formes, telles qu'une flèche, une croix, une ligne ou un index.
Le polymorphisme est l'une des caractéristiques les plus importantes de la POO. En Java et Python, les variables, les objets et les fonctions peuvent exister sous de nombreuses formes. Dans le polymorphisme, une sous-classe ou une méthode définit ses attributs et ses comportements tout en conservant certaines des fonctionnalités de sa classe mère. Cela nous amène à l'héritage, qui vous permet de créer des hiérarchies de classes où une classe de base donne ses attributs et son comportement à une classe dérivée. Par la suite, les fonctionnalités de la classe dérivée peuvent être librement modifiées ou étendues selon les besoins. À cette fin, le polymorphisme garantit que la méthode correcte est exécutée en fonction du type de l'objet appelant.
Pour mettre les choses en perspective, supposons que vous ayez une classe qui affiche la date et l'heure. Maintenant, vous créez une méthode qui hérite de la classe et affiche le message "Hello!" ainsi que la date et l'heure.
Exemple de polymorphisme en Java
Considérez la superclasse "Shapes" qui a une méthode "area()". Les sous-classes sous "Forme" peuvent être "Rectangle", "Cercle", "Triangle", etc., et chaque sous-classe a sa méthode de calcul de surface. En appliquant les concepts d'héritage et de polymorphisme, les sous-classes utilisent la méthode "area()" pour trouver la formule de calcul de l'aire de la forme respective.
Formes de classe {
zone vide publique() {
System.out.println("La formule pour la zone de ");
}
}
la classe Triangle étend les formes {
zone vide publique() {
System.out.println("Le triangle est 1/2 * base * hauteur ");
}
}
la classe Cercle étend les Formes {
zone vide publique() {
System.out.println("Le cercle est de 3,14 * rayon * rayon ");
}
}
classe principale {
public static void main(String[] args) {
Formes maForme = new Formes(); // Crée un objet Shapes
Formes monTriangle = new Triangle(); // Crée un objet Triangle
Formes monCercle = new Cercle(); // Crée un objet Cercle
maForme.zone();
monTriangle.area();
maForme.zone();
myCircle.area();
}
}
La sortie du code de programme ci-dessus sera la suivante :
La formule pour l'aire du triangle est 1/2 * base * hauteur
La formule pour l'aire du cercle est 3,14 * rayon * rayon
Types de polymorphisme dans les POO
Le polymorphisme dans les POO est de deux types : statique (polymorphisme à la compilation) et dynamique (polymorphisme à l'exécution).
1. Polymorphisme statique
En Java, la surcharge de méthode est le type de polymorphisme statique le plus courant. Il peut créer plusieurs méthodes du même nom au sein de la même classe mais avec des paramètres différents. Les jeux de paramètres doivent différer sur au moins un des trois critères suivants :
- Les méthodes doivent avoir un nombre différent de paramètres.
- Les types de paramètres doivent être différents. Par exemple, si une méthode accepte un Long, l'autre accepte un String.
- Les méthodes doivent accepter les paramètres dans des ordres différents. Par exemple, si la méthode 1 accepte un Long et un String, la deuxième méthode doit accepter un String puis un Long.
Dans la surcharge de méthode, lors de l'appel de la méthode, le compilateur choisit la méthode à appeler en fonction des paramètres passés lors de l'appel. Cela se produit au moment de la compilation et, par conséquent, ce type de polymorphisme est également appelé polymorphisme au moment de la compilation.
Voici un exemple de code Java pour montrer le polymorphisme au moment de la compilation. Dans cet exemple, la méthode add() est surchargée avec deux types de paramètres différents.
package staticPolymorphism ;
Ajout de classe publique
{
somme nulle (int x, int y)
{
entier c = x+y ;
System.out.println(“ Addition de deux nombres :” +c); }
somme nulle (int x, int y, int z)
{
entier c = x+y+z ;
System.out.println(“ Addition de trois nombres :” +c); }
public static void main(String[] args)
{
Addition obj = new Addition();
somme obj ( 45,34);
obj. somme(60, 32, 11);
}
}
La sortie du programme ci-dessus sera :
Addition de deux nombres :79
Addition de trois nombres : 103
2. Polymorphisme dynamique
Le polymorphisme dynamique ou d'exécution est obtenu par le remplacement de méthode. Ici, les méthodes se présentent sous différentes formes dans différentes classes (substitution de méthode), et au lieu de la compilation, l'appel à une méthode surchargée est résolu au moment de l'exécution. Désormais, lors de l'affectation d'un objet à une référence de classe et de l'appel d'une méthode, la méthode de la classe de l'objet est exécutée. Puisque l'objet est créé au moment de l'exécution, la forme de la méthode (dans l'objet) qui doit être exécutée n'est décidée qu'au moment de l'exécution.
Voici un exemple de code Java pour montrer le polymorphisme d'exécution . Dans l'exemple, il y a une super-classe "Animal" et trois sous-classes, "kangourou", "tigre" et "poisson". Les sous-classes étendent la superclasse et remplacent sa méthode "move ()". La méthode "move()" est appelée par la variable de référence de la classe parent "Animal".
classe Animal{
annuler le déplacement(){
System.out.println("Les animaux se déplacent");
}
}
la classe kangourou étend Animal{
annuler le déplacement(){
System.out.println("Les kangourous sautent");
}
}
la classe tigre étend Animal{
annuler le déplacement(){
System.out.println("Les tigres marchent");
}
}
la classe poisson étend Animal{
annuler le déplacement(){
System.out.println("Poisson nage");
}
}
classe principale{
public static void main(String args[]){
Animal A = nouvel Animal();
Animal k = nouveau kangourou(); //upcasting
Animal t = nouveau tigre(); //upcasting
Animal f = nouveau poisson(); //upcasting
Un mouvement();
k.move();
t.move();
f.move();
}
}
La sortie du programme ci-dessus sera :
Les animaux bougent
Les kangourous sautent
Les tigres marchent
Nage de poisson
Polymorphisme en Python
Le polymorphisme en Python est de trois types : polymorphisme d'opérateur, polymorphisme de fonction et polymorphisme de classe. Python permet également le remplacement de méthode mais pas la surcharge de méthode.
1. Polymorphisme des opérateurs
En Python, l'opérateur '+' a un double usage. Il est utilisé pour les opérations d'addition arithmétique dans le cas de types de données entiers, et pour les chaînes, l'opérateur '+' effectue des concaténations.
Voici un exemple de code Python dans lequel l'opérateur '+' effectue une addition sur des types de données entiers :
nombre1 = 4
num2 = 5
imprimer(num1+num2)
La sortie du code de programme ci-dessus est '9.'
Voici un exemple de code Python où l'opérateur '+' effectue une concaténation sur les types de données de chaîne :
str1 = "Bien"
str2 = "Soirée"
print(str1+" "+str2)
La sortie du programme ci-dessus sera "Bonsoir".
2. Polymorphisme de fonction
La fonction 'len()' en Python est compatible avec différents types de données tels que liste, chaîne, tuple, dictionnaire et ensemble, mais renvoie des informations spécifiques pour chaque type de données. Voici un exemple :
print(len("Programmeur"))
print(len(["Python", "Java", "C"]))
print(len({"Nom": "Kathy", "Adresse": "Texas"}))
Le programme ci-dessus aura la sortie suivante :
9
3
2
3. Polymorphisme de classe
Étendant le concept de polymorphisme, Python permet à plusieurs classes d'avoir des méthodes portant le même nom. Ci-dessous est un exemple pour montrer le polymorphisme dans les méthodes de classe en Python. Dans l'exemple, il y a deux classes, "Chat" et "Chien". Ils ont une structure similaire et ont les mêmes noms de méthode 'make_sound(),' et 'info().'
chat de classe :
def __init__(soi, nom, age):
soi.nom = nom
self.age = age
def info(soi):
print(f"Je suis un chat. Je m'appelle {self.name}. J'ai {self.age} ans.")
def make_sound(self):
imprimer ("Miaou")
Chien de classe :
def __init__(soi, nom, age):
soi.nom = nom
self.age = age
def info(soi):
print(f"Je suis un chien. Je m'appelle {self.name}. J'ai {self.age} ans.")
def make_sound(self):
print("Écorce")
chat1 = Chat("Minnie", 3)
chien1 = Chien("Tom", 6)
pour animal dans (cat1, dog1):
animal.make_sound()
animal.info()
animal.make_sound()
La sortie sera la suivante :
Miaou
Je suis un chat. Je m'appelle Minnie. J'ai 3 ans.
Miaou
Aboyer
Je suis un chien. Mon nom est Tom. J'ai 6 ans.
Aboyer
4. Remplacer la méthode
Python permet également aux classes enfants d'hériter des attributs et des méthodes de la classe parent. Certaines méthodes et certains attributs peuvent être redéfinis pour s'adapter à la classe enfant (substitution de méthode). Le polymorphisme permet ensuite d'accéder aux méthodes et attributs surchargés portant le même nom que la classe parent.
Voici un exemple de code Python pour illustrer le remplacement de méthode :
à partir de l'importation mathématique pi
Forme de la classe :
def __init__(soi, nom):
soi.nom = nom
zone def(soi):
passe
def fact(self):
retour "Je suis une figure fermée."
def __str__(soi) :
retourner self.name
classe Carré (Forme):
def __init__(soi, longueur):
super().__init__("Carré")
self.length = longueur
zone def(soi):
return self.length**2
def fact(self):
return "Chaque angle d'un carré est égal à 90 degrés."
cercle de classe (forme):
def __init__(soi, rayon):
super().__init__("Cercle")
self.radius = rayon
zone def(soi):
renvoie pi*self.radius**2
a = Carré(4)
b = Cercle(7)
impression(b)
print(b.fact())
print(a.fact())
print(b.area())
Le programme ci-dessus aura la sortie suivante :
Cercle
Je suis une figure fermée.
Chaque angle dans un carré est égal à 90 degrés.
153.93804002589985
En savoir plus sur le remplacement de méthode.
Avantages du polymorphisme dans les POO
Le polymorphisme dans les POO présente trois avantages significatifs. Ils sont les suivants :
- Le polymorphisme permet la réutilisation du code. Par conséquent, une fois les classes écrites, testées et implémentées, vous pouvez les réutiliser encore et encore. De plus, le code peut être modifié sans affecter le code d'origine. Tout cela fait gagner un temps considérable au codeur.
- Dans le polymorphisme, plusieurs valeurs de données peuvent être stockées dans une seule variable. De plus, la valeur d'une variable héritée d'une superclasse dans une sous-classe peut être modifiée sans changer la valeur de la variable dans la superclasse ou toute sous-classe.
- Enfin, le polymorphisme fonctionne avec moins de lignes de code, ce qui, à son tour, facilite le débogage pour le programmeur.
Aller de l'avant
upGrad, en partenariat avec la prestigieuse université John Moores de Liverpool, propose un programme en ligne rigoureux de maîtrise ès sciences en science des données pour les professionnels en activité aspirant à faire carrière dans la science des données. Le cours se termine par une maîtrise de LJMU et une certification Executive PG Program de l'IIIT Bangalore.
Faits saillants du programme :
- Plus de 500 heures de contenu, plus de 60 études de cas et projets, plus de 20 sessions en direct
- Couverture complète de plus de 14 outils et logiciels tels que Python, AWS, MySQL, etc.
- Séances de coaching avec des experts de l'industrie
- Apprentissage par les pairs et réseautage industriel
- Accompagnement carrière à 360 degrés
L'une des meilleures plates-formes EdTech supérieures aujourd'hui, upGrad continue d'inspirer et de préparer les apprenants grâce à une combinaison de technologie de pointe, de la dernière pédagogie, de partenariats industriels et d'un corps professoral de classe mondiale.
Apprenez des cours de science des données en ligne dans les meilleures universités du monde. Gagnez des programmes Executive PG, des programmes de certificat avancés ou des programmes de maîtrise pour accélérer votre carrière.
Pourquoi le polymorphisme est-il utilisé dans les POO ?
Dans les POO, le polymorphisme est la méthode qui exécute différentes tâches en fonction de la classe de l'objet qui l'appelle. Ainsi, un message est envoyé aux objets de plusieurs classes, et chaque objet répond selon les propriétés de la classe.
Qu'est-ce que la surcharge de méthode en Java ?
En Java, deux ou plusieurs méthodes ayant le même nom peuvent différer dans leurs paramètres (différents types de paramètres, différents nombres de paramètres, ou les deux). Ces méthodes sont appelées méthodes surchargées et la fonctionnalité est appelée surcharge de méthode.
Quelle est la différence entre surcharge et dépassement ?
Lorsque deux méthodes ou plus dans la même classe ont des paramètres différents mais le même nom, cela s'appelle une surcharge. D'un autre côté, la surcharge se produit lorsque la superclasse et la classe enfant ont la même signature de méthode (nom et paramètres).