Om du kan köra en 4-dörrars pendlarbil kan du också köra en pickup. Om du har kört en bil med en förbränningsmotor kan du också köra en elbil.

Formen och storleken på personbilar kan vara olika från det ena till det andra. Motorn som kör dessa fordon kan också vara helt annorlunda. Men det spelar ingen roll för föraren.

Du går bara in, spänner, startar fordonet, sätter det i växel och kör. Det beror på att bilar, lastbilar och skåpbilar är det polymorf.

Polymorfism: Att bryta ner det

Låt oss titta på ordet polymorfism. Du kan bryta ner det i poly, morph, och ism.

Poly betyder många, som hur polygon betyder många vinklar. När det används som substantiv, a morph är en variant av en art. Och ism kan betyda system.

Så polymorfism betyder helt enkelt ett system med många variationer. Det berättar fortfarande inte mycket om hur det används i programmering. Det är nästa.

Om det går som en anka... Varför polymorfa objekt är fantastiska

När du skapar en klass i din kod som ärver från en annan klass, binder du den nya klassen till ett kontrakt. I kontraktet anges att varje variabel och funktion i föräldern också kommer att finnas i barnet.

instagram viewer

Varje fordon har en ratt, gas- och bromspedaler och en blinkers. Du behöver inte öppna huven för att köra bil. Allt som spelar roll är att det är en bil.

Samma sak gäller klasser som ärver från andra klasser. Här är ett exempel i TypeScript:


klass Fordon {
privat _motor: string;
privata _däck: antal;
konstruktör (motor: string = "förbränning", däck: antal = 4) {
this._engine = motor;
detta._däck = däck;
}
accelerera (hastighet: antal) {
console.log ("acceleration med en hastighet av" + hastighet);
}
broms (tryck: antal) {
console.log ("applicering" + tryck + "tryck");
}
sväng vänster() {
console.log ("sväng vänster");
}
sväng höger() {
console.log ("sväng höger");
}
}
klass Bil förlänger fordon {
}
klass Tesla utökar bil {
konstruktör () {
super ("elektrisk");
}
}

I det här exemplet finns det en Fordon klass. De Bil klassen ärver från Fordon klass. Och Tesla ärver från Bil. Låt oss nu skapa ett par objekt och titta på dem.

låt myCoupe: Bil = nytt fordon ();
console.log (myCoupe);
console.log (myCoupe.constructor.name);
låt mySedan: Fordon = ny Tesla ();
console.log (mySedan);
console.log (mySedan.constructor.name);
myCoupe.turnLeft ();
mySedan.turnLeft ();

Du kan se att vi förklarade myCoupe att vara en Bil och mySedan att vara en Fordon. Sedan instanserade vi myCoupe som en ny Fordon och mySedan som en ny Tesla. Om du Besök TypeScript -sandlådan och kör koden, du ser att den fungerar utan fel. Och det beter sig som du skulle förvänta dig, baserat på kontraktet.

Med andra ord kan alla fordon svänga vänster eftersom de ärvde det från Fordon klass. Kompilatorn vet att varje barn av Fordon gick med på kontraktet. Så det förutsätter att allt är bra, oavsett vilka klasser objekten skrevs eller instanserades som.

Detta kallas ibland "anka typning." Kompilatorn antar att om den går som en anka och pratar som en anka, kan den lika gärna vara en anka. Så kompilatorn oroar sig inte för detaljerna och behandlar bara objektet som en anka.

Polymorfism gör din kod skottsäker

En annan fördel med polymorfismavtalet är en garanti för att din kod fungerar. Om du har skrivit starkt alla dina variabler och vad varje funktion returnerar, vet du att varje barn alltid kommer att matcha variabler, funktioner och typer.

Det betyder att du kan lägga till och ändra koden i dina klasser utan att bryta ditt program. Varje objekt som refererar till a Fordon objektet kommer alltid att få data och funktionalitet som uppfyller förväntningarna, oavsett hur mycket Bil ändringar.

Koden inuti funktionen kanske inte ger ut korrekta resultat. Men det är ett annat slags problem. Så länge funktionen följer kontraktet och returnerar den förväntade variabeln, kommer det inte att resultera i ett kodbrytande fel.

Polymorfism är enorm, och här är ytterligare 10 programmeringsprinciper du borde känna till.

Öva polymorfism

  • Använd sandlådelänken ovan för att skapa en Båt klass.
  • Instantiera ett nytt båtobjekt på ett sådant sätt att det är en Fordon typ, men ser fortfarande ut som en båt.
  • Se till att båten fortfarande fungerar som ett fordon.

Ett sista exempel på polymorfism

Polymorfism kan vara ett knepigt begrepp att inledningsvis förstå. Men när du väl har fått det har du tagit ett stort steg mot att förstå vad objektorienterad programmering egentligen handlar om. Konceptet kan dock fortfarande verka teoretiskt. Så här är ett solidt verkligt exempel för att hjälpa dig att se hur användbart det är.

Tänk dig att du bygger en webbapp som ansluter till en MySQL -databas. Sedan bestämmer chefen att byta till en PostgreSQL -databas. Betyder det att du måste skriva om alla dina databasanrop?

Nej, det gör det inte. Om din app använder en Datatillgång klass med underklasser som faktiskt muckar med data, har du tur. De Datatillgång class definierar hur din app interagerar med data, inte hur den interagerar med databasen.

Du har underklasser som MySQLAccess och PostgresQLAccess som gör allt smutsigt arbete. Men om din app bara har Datatillgång objekt kan du byta ut databaser utan att skriva om en enda rad med appkod.

Dela med sigTweetE-post
Hur man organiserar din objektorienterade kod med arv

Att få objektorienterad programmering rätt innebär att du behöver veta om arv och hur det kan förenkla kodning och minska fel.

Läs Nästa

Relaterade ämnen
  • Programmering
  • Programmering
  • Objektorienterad programmering
Om författaren
Lee Nathan (19 artiklar publicerade)

Lee är en nomad på heltid och en polymat med många passioner och intressen. Några av dessa passioner kretsar kring produktivitet, personlig utveckling och skrivande.

Mer från Lee Nathan

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera