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, 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 fourgonnettes sont polymorphe.

Polymorphisme: le décomposer

Regardons le mot polymorphisme. Vous pouvez le décomposer en poly, métamorphose, et isme.

Poly signifie beaucoup, comme comment polygone signifie plusieurs angles. Lorsqu'il est utilisé comme nom, un métamorphose est une variante d'une espèce. Et 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 le suivant.

instagram viewer

S'il marche comme un canard... Pourquoi les objets polymorphes sont géniaux

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 c'est une voiture.

La même chose s'applique aux classes qui héritent d'autres classes. Voici un exemple en TypeScript:


classe Véhicule {
moteur_privé: chaîne ;
_pneus privés: nombre ;
constructeur (moteur: string = "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 voiture de classe étend le véhicule {
}
classe Tesla étend Car {
constructeur() {
super("électrique");
}
}

Dans cet exemple, il y a un Véhicule classer. Le Auto la classe hérite de la Véhicule classer. Et Tesla hérite de Auto. Créons maintenant quelques objets et examinons-les.

let myCoupe: Car = new Vehicle();
console.log (myCoupe);
console.log (myCoupe.constructor.name);
let mySedan: Vehicle = new Tesla();
console.log (mySedan);
console.log (mySedan.constructor.name);
maCoupe.turnLeft();
maSedan.turnLeft();

Vous pouvez voir que nous avons déclaré monCoupé être un Auto et ma berline être un Véhicule. Ensuite, nous avons instancié monCoupé en tant que nouveau Véhicule et ma berline en tant que nouveau Tesla. Si tu visitez le bac à sable TypeScript et exécutez le code, vous verrez que cela fonctionne sans erreur. Et il se comporte comme on peut s'y attendre, sur la base 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 Véhicule accepté le contrat. Il suppose donc que tout va bien, quelles que soient les classes dans lesquelles les objets ont été tapés ou instanciés.

C'est ce qu'on appelle parfois la « dactylographie du 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.

Le polymorphisme rend votre code à l'épreuve des balles

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 classes sans casser votre programme. Chaque objet qui fait référence à un Véhicule objet obtiendra toujours des données et des fonctionnalités qui répondent aux attentes, peu importe combien Auto changements.

Le code à l'intérieur de la fonction peut ne pas afficher les résultats corrects. Mais c'est un autre genre 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.

Pratiquer le polymorphisme

  • Utilisez le lien sandbox ci-dessus pour créer un Bateau classer.
  • Instanciez un nouvel objet bateau de telle sorte qu'il soit un Véhicule type, mais ressemble toujours à un bateau.
  • Assurez-vous que le bateau se comporte toujours comme un véhicule.

Un dernier exemple de polymorphisme

Le polymorphisme peut être un concept difficile à appréhender au départ. Mais une fois que vous l'avez compris, vous avez fait un pas de géant 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 exemple concret solide 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 Accès aux données classe avec des sous-classes qui manipulent réellement les données, vous avez de la chance. Le Accès aux données class 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 Accès MySQL et PostgresQLAccess qui font tout le sale boulot. Mais si votre application n'a que Accès aux données objets, vous pouvez échanger des bases de données sans réécrire une seule ligne de code d'application.

PartagerTweeterE-mail
Comment organiser votre code orienté objet avec l'héritage

Une programmation orientée objet correctement signifie que vous devez connaître l'héritage et savoir comment il peut simplifier le codage et réduire les erreurs.

Lire la suite

Rubriques connexes
  • Programmation
  • Programmation
  • Programmation orientée objet
A propos de l'auteur
Lee Nathan (19 articles publiés)

Lee est un nomade à temps plein et un polymathe avec de nombreuses passions et intérêts. Certaines de ces passions tournent autour de la productivité, du développement personnel et de l'écriture.

Plus de Lee Nathan

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner