Si vous pouvez conduire une voiture de banlieue à 4 portes, vous pouvez également conduire une camionnette. Si vous avez conduit une voiture avec un moteur à combustion, vous pouvez également conduire une voiture électrique.
La forme et la taille des véhicules de tourisme peuvent être différentes d'un véhicule à l'autre. Le moteur qui fait fonctionner ces véhicules pourrait également être complètement différent. Mais cela n'a pas d'importance pour le conducteur.
Il vous suffit de monter à bord, de boucler votre ceinture, de démarrer le véhicule, de le mettre en marche et de conduire. C'est parce que les voitures, les camions et les camionnettes sont polymorphes .
Regardons le mot polymorphisme. Vous pouvez le décomposer en poly , morphe , et isme .
poly signifie beaucoup, comme la façon dont polygone signifie plusieurs angles. Lorsqu'il est utilisé comme nom, un morph est une variante d'une espèce. Et le isme peut signifier système.
Ainsi, le polymorphisme signifie simplement un système de nombreuses variations. Cela ne vous dit toujours pas grand-chose sur la façon dont il est utilisé dans la programmation, cependant. C'est la prochaine.
Lorsque vous créez une classe dans votre code qui hérite d'une autre classe, vous liez la nouvelle classe à un contrat. Le contrat stipule que chaque variable et fonction dans le parent sera également dans l'enfant.
Chaque véhicule a un volant, des pédales d'accélérateur et de frein et un clignotant. Vous n'avez pas besoin d'ouvrir le capot pour conduire une voiture. Tout ce qui compte, c'est que ce soit une voiture.
La même chose s'applique aux classes qui héritent d'autres classes. Voici un exemple en TypeScript :
Véhicule de classe {
moteur_privé :chaîne ;
_pneus privés :nombre ;
constructeur(moteur :chaîne ="combustion", pneus :nombre =4) {
this._engine =moteur ;
this._tires =pneus ;
}
accélérer(vitesse :nombre) {
console.log("accélération à une vitesse de " + vitesse);
}
frein(pression :nombre) {
console.log("appliquer " + pression + " pression");
}
Tourner à gauche() {
console.log("tourner à gauche");
}
Tournez à droite() {
console.log("tourner à droite");
}
}
la classe Voiture étend le véhicule {
}
la classe Tesla étend la voiture {
constructeur() {
super("électrique");
}
}
Dans cet exemple, il y a un Véhicule classer. La voiture la classe hérite du véhicule classer. Et Tesla hérite de Voiture . Créons maintenant quelques objets et regardons-les.
let myCoupe :Car =new Vehicle();
console.log(maCoupe);
console.log(myCoupe.constructor.name);
let mySedan :Vehicle =new Tesla();
console.log(maberline);
console.log(mySedan.constructor.name);
maCoupe.tournerGauche();
maberline.tourneràgauche();
Vous pouvez voir que nous avons déclaré myCoupe être une voiture et maberline être un Véhicule . Ensuite, nous avons instancié myCoupe en tant que nouveau Véhicule et maberline comme une nouvelle Tesla . Si vous visitez le bac à sable TypeScript et exécutez le code, vous verrez qu'il fonctionne sans erreur. Et il se comporte comme prévu, en fonction du contrat.
En d'autres termes, tous les véhicules peuvent tourner à gauche car ils l'ont hérité du Véhicule classer. Le compilateur sait que chaque enfant de Vehicle accepté le contrat. Il suppose donc que tout va bien, quelles que soient les classes dans lesquelles les objets ont été typés ou instanciés.
Ceci est parfois appelé "typage de canard". Le compilateur suppose que s'il marche comme un canard et parle comme un canard, il pourrait tout aussi bien être un canard. Ainsi, le compilateur ne se soucie pas des détails et traite simplement l'objet comme un canard.
Un autre avantage du contrat de polymorphisme est la garantie que votre code fonctionnera. Si vous avez fortement tapé toutes vos variables et ce que chaque fonction renvoie, vous savez que chaque enfant correspondra toujours aux variables, fonctions et types.
Cela signifie que vous pouvez ajouter et modifier le code de vos cours sans interrompre votre programme. Chaque objet faisant référence à un Véhicule l'objet obtiendra toujours des données et des fonctionnalités qui répondent aux attentes, quelle que soit la quantité de Car changements.
Le code à l'intérieur de la fonction peut ne pas afficher les résultats corrects. Mais c'est un autre type de problème. Tant que la fonction suit le contrat et renvoie le type de variable attendu, cela n'entraînera pas d'erreur de rupture de code.
Le polymorphisme est énorme, et voici 10 autres principes de programmation que vous devriez connaître.
Le polymorphisme peut être un concept difficile à appréhender au départ. Mais une fois que vous l'avez compris, vous avez fait un grand pas vers la compréhension de ce qu'est vraiment la programmation orientée objet. Le concept peut cependant sembler encore théorique. Voici donc un solide exemple concret pour vous aider à voir à quel point il est utile.
Imaginez que vous créez une application Web qui se connecte à une base de données MySQL. Ensuite, le patron décide de passer à une base de données PostgreSQL. Cela signifie-t-il que vous devez réécrire tous vos appels de base de données ?
Non, ce n'est pas le cas. Si votre application utilise un DataAccess classe avec des sous-classes qui s'amusent avec les données, vous avez de la chance. L'accès aux données La classe définit comment votre application interagit avec les données, et non comment elle interagit avec la base de données.
Vous avez des sous-classes comme MySQLAccess et PostgresQLAccess qui font tout le sale boulot. Mais si votre application ne dispose que de DataAccess objets, vous pouvez échanger des bases de données sans réécrire une seule ligne de code d'application.