Was ist Polymorphismus? Und warum es sich lohnt zu lernen
Wenn Sie ein viertüriges Pendlerauto fahren können, können Sie auch einen Pickup fahren. Wenn Sie ein Auto mit einem Verbrennungsmotor gefahren sind, können Sie auch ein Elektroauto fahren.
Die Form und Größe von Personenkraftwagen kann von einem zum nächsten unterschiedlich sein. Der Motor, der diese Fahrzeuge antreibt, könnte ebenfalls völlig anders sein. Für den Fahrer ist das aber egal.
Sie steigen einfach ein, schnallen sich an, starten das Fahrzeug, legen den Gang ein und fahren. Das liegt daran, dass Autos, Lastwagen und Lieferwagen polymorph sind .
Polymorphismus: Zerlegen
Schauen wir uns das Wort Polymorphismus an. Sie können es in Poly , Morph und Ismus zerlegen .
Poly bedeutet viele, so wie Polygon viele Winkel bedeutet. Bei Verwendung als Substantiv ist ein Morph eine Variante einer Art. Und Ismus kann System bedeuten.
Polymorphismus bedeutet also einfach ein System mit vielen Variationen. Das sagt aber immer noch nicht viel darüber aus, wie es in der Programmierung verwendet wird. Das ist der nächste.
Wenn es wie eine Ente läuft … Warum polymorphe Objekte fantastisch sind

Wenn Sie in Ihrem Code eine Klasse erstellen, die von einer anderen Klasse erbt, binden Sie die neue Klasse an einen Vertrag. Der Vertrag sieht vor, dass jede Variable und Funktion im Elternteil auch im Kind enthalten ist.
Jedes Fahrzeug hat ein Lenkrad, Gas- und Bremspedale sowie einen Blinker. Sie müssen die Motorhaube nicht öffnen, um ein Auto zu fahren. Alles was zählt ist, dass es ein Auto ist.
Gleiches gilt für Klassen, die von anderen Klassen erben. Hier ist ein Beispiel in TypeScript:
class Vehicle {
private _engine: string;
private _tires: number;
constructor(engine: string = "combustion", tires: number = 4) {
this._engine = engine;
this._tires = tires;
}
accelerate(velocity: number) {
console.log("accelerating at a velocity of " + velocity);
}
brake(pressure: number) {
console.log("applying " + pressure + " pressure");
}
turnLeft() {
console.log("turning left");
}
turnRight() {
console.log("turning right");
}
}
class Car extends Vehicle {
}
class Tesla extends Car {
constructor() {
super("electric");
}
}
In diesem Beispiel gibt es eine Fahrzeugklasse . Die Car – Klasse erbt von der Fahrzeugklasse. Und Tesla erbt von Car . Lassen Sie uns nun ein paar Objekte erstellen und sie betrachten.
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);
myCoupe.turnLeft();
mySedan.turnLeft();
Sie können sehen, dass wir myCoupe als Auto und mySedan als Fahrzeug deklariert haben . Dann haben wir myCoupe als neues Fahrzeug und mySedan als neuen Tesla instanziiert. Wenn Sie die TypeScript-Sandbox besuchen und den Code ausführen, werden Sie feststellen, dass er fehlerfrei funktioniert . Und es verhält sich wie erwartet, basierend auf dem Vertrag.
Mit anderen Worten, alle Fahrzeuge können nach links abbiegen, weil sie es von der Fahrzeugklasse geerbt haben. Der Compiler weiß, dass jedes Fahrzeugkind dem Vertrag zugestimmt hat. Es wird also davon ausgegangen, dass alles in Ordnung ist, unabhängig davon, in welchen Klassen die Objekte eingegeben oder instanziiert wurden.
Dies wird manchmal als "Ententypisierung" bezeichnet. Der Compiler geht davon aus, dass es genauso gut eine Ente sein kann, wenn es wie eine Ente läuft und wie eine Ente spricht. Der Compiler kümmert sich also nicht um die Details und behandelt das Objekt wie eine Ente.
Polymorphismus macht Ihren Code kugelsicher
Ein weiterer Vorteil des Polymorphismusvertrags ist die Garantie, dass Ihr Code funktioniert. Wenn Sie alle Ihre Variablen stark eingegeben haben und wissen, was jede Funktion zurückgibt, wissen Sie, dass jedes Kind immer mit Variablen, Funktionen und Typen übereinstimmt.
Das heißt, Sie können den Code in Ihren Klassen ergänzen und ändern, ohne Ihr Programm zu beschädigen. Jedes Objekt, das auf ein Fahrzeugobjekt verweist, erhält immer Daten und Funktionen, die den Erwartungen entsprechen, unabhängig davon, wie stark sich das Auto ändert.
Der Code in der Funktion gibt möglicherweise nicht die richtigen Ergebnisse aus. Aber das ist ein anderes Problem. Solange die Funktion dem Vertrag folgt und den erwarteten Variablentyp zurückgibt, führt dies nicht zu einem Fehler beim Aufbrechen des Codes.
Der Polymorphismus ist riesig und hier sind 10 weitere Programmierprinzipien, die Sie kennen sollten .
Polymorphismus üben

- Verwenden Sie den Sandbox – Link oben , um eine Boot – Klasse zu erstellen.
- Instanziieren Sie ein neues Bootsobjekt so, dass es sich um einen Fahrzeugtyp handelt , aber dennoch wie ein Boot aussieht.
- Stellen Sie sicher, dass sich das Boot immer noch wie ein Fahrzeug verhält.
Ein letztes Beispiel für Polymorphismus
Polymorphismus kann anfangs ein schwieriges Konzept sein. Aber sobald Sie es verstanden haben, haben Sie einen großen Schritt getan, um zu verstehen, worum es bei objektorientierter Programmierung wirklich geht. Das Konzept mag jedoch immer noch theoretisch erscheinen. Hier ist ein solides Beispiel aus der Praxis, das Ihnen zeigt, wie nützlich es ist.
Stellen Sie sich vor, Sie erstellen eine Web-App, die eine Verbindung zu einer MySQL-Datenbank herstellt. Dann beschließt der Chef, zu einer PostgreSQL-Datenbank zu wechseln. Bedeutet das, dass Sie alle Ihre Datenbankaufrufe neu schreiben müssen?
Nein, das tut es nicht. Wenn Ihre App eine DataAccess- Klasse mit Unterklassen verwendet, die tatsächlich mit den Daten herumspielen , haben Sie Glück. Die DataAccess- Klasse definiert, wie Ihre App mit Daten interagiert, nicht wie sie mit der Datenbank interagiert.
Sie haben Unterklassen wie MySQLAccess und PostgresQLAccess , die die ganze Drecksarbeit erledigen. Wenn Ihre App jedoch nur DataAccess- Objekte enthält, können Sie Datenbanken austauschen , ohne eine einzige Zeile App-Code neu schreiben zu müssen.