OOP begrepp för nybörjare: Vad är polymorfism

OOP begrepp för nybörjare: Vad är polymorfism

ordet polymorfism används i olika sammanhang och beskriver situationer där något förekommer i flera olika former. I datavetenskap beskriver det konceptet att objekt av olika slag kan nås via samma gränssnitt. Varje typ kan ge sin egen, oberoende implementering av detta gränssnitt. Det är en av kärnkoncepten för objektorienterad programmering (OOP).,

om du undrar om ett objekt är polymorf kan du utföra ett enkelt test. Om objektet framgångsrikt passerar flera is-a eller instanceav tester är det polymorf. Som jag har beskrivit i mitt inlägg om arv utökar alla Java-klasser klassobjektet. På grund av detta är alla objekt i Java polymorfa eftersom de passerar minst två instanceav kontroller.,

olika typer av polymorfism

Java stöder 2 typer av polymorfism:

  • statisk eller kompileringstid
  • dynamisk

statisk polymorfism

Java, liksom många andra objektorienterade programmeringsspråk, låter dig implementera flera metoder inom samma klass som använder samma namn men en annan uppsättning parametrar. Det kallas metod överbelastning och representerar en statisk form av polymorfism.,

parameteruppsättningarna måste skilja sig åt i minst ett av följande tre kriterier:

  • de måste ha ett annat antal parametrar, t.ex. en metod accepterar 2 och en annan 3 parametrar.
  • parametertyperna måste vara olika, t.ex. en metod accepterar en sträng och en annan en lång.
  • de måste förvänta sig parametrarna i en annan ordning, t.ex. en metod accepterar en sträng och en lång och en annan accepterar en lång och en sträng. Denna typ av överbelastning rekommenderas inte eftersom det gör API svårt att förstå.,

i de flesta fall ger var och en av dessa överbelastade metoder en annan men mycket liknande funktionalitet.

på grund av de olika uppsättningarna av parametrar har varje metod en annan signatur. Det gör det möjligt för kompilatorn att identifiera vilken metod som ska kallas och att binda den till metodanropet. Detta tillvägagångssätt kallas statisk bindning eller statisk polymorfism.

Låt oss ta en titt på ett exempel.

ett enkelt exempel på statisk polymorfism

Jag använder samma CoffeeMachine-projekt som jag använde i de tidigare inläggen i denna serie. Du kan klona den på https://github.com/thjanssen/Stackify-OopInheritance.,

klassen BasicCoffeeMachine implementerar två metoder med namnet brewCoffee. Den första accepterar en parameter av typ Kaffeval. Den andra metoden accepterar två parametrar, en Kaffeval och en int.

nu när du anropar en av dessa metoder identifierar den angivna uppsättningen parametrar den metod som måste anropas.

i följande kodavsnitt anropar jag metoden endast med ett Kaffevalsobjekt. Vid kompilering binder Java-kompilatorn denna metodanrop till brewCoffee(CoffeeSelection selection) – metoden.,

BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);

om jag ändrar den här koden och kallar brewCoffee-metoden med ett CoffeeSelection-objekt och ett int, binder kompilatorn metodanropet till den andra brewCoffee-metoden(CoffeeSelection selection, int number).

dynamisk polymorfism

denna form av polymorfism tillåter inte kompilatorn att bestämma den exekverade metoden. JVM måste göra det vid körning.

inom en arvshierarki kan en underklass åsidosätta en metod för dess superklass. Det gör det möjligt för utvecklaren av underklassen att anpassa eller helt ersätta beteendet hos den metoden.,

det skapar också en form av polymorfism. Båda metoderna, implementerade av super – och underklassen, delar samma namn och parametrar men ger olika funktionalitet.

Låt oss ta en titt på ett annat exempel från CoffeeMachine-projektet.

metod som åsidosätter i en arvshierarki

klassen BasicCoffeeMachine är superklassen i klassen PremiumCoffeeMachine.

båda klasserna ger en implementering av brewCoffee(Coffees selection selection) – metoden.,

om du läser inlägget om OOP concept arv, vet du redan de två implementeringarna av brewCoffee-metoden. BasicCoffeeMachine stöder bara Kaffevalet.FILTER_COFFEE. BrewCoffee-metoden i PremiumCoffeeMachine-klassen lägger till stöd för Kaffeval.ESPRESSO. Om det blir kallat med något annat Kaffeval använder det sökordet super för att delegera samtalet till superklassen.,

sen bindning

När du vill använda en sådan arvshierarki i ditt projekt måste du kunna svara på följande fråga:vilken metod kommer JVM-samtalet?

det kan bara besvaras vid körning eftersom det beror på objektet som metoden anropas på. Typen av referens, som du kan se i din kod, är irrelevant. Du måste skilja mellan tre allmänna scenarier:

  1. ditt objekt är av typen av superklass och refereras som superklass., Så, i exemplet på det här inlägget, blir ett BasicCoffeeMachine-objekt refererat som en BasicCoffeeMachine.
  2. ditt objekt är av typen av underklassen och refereras som underklassen. I exemplet på det här inlägget refereras ett PremiumCoffeeMachine-objekt som en PremiumCoffeeMachine.
  3. ditt objekt är av typen av underklassen och refereras som superklassen. I exemplet CoffeeMachine refereras ett PremiumCoffeeMachine-objekt som en BasicCoffeeMachine.
superklass refererad som superklass

det första scenariot är ganska enkelt., När du instantierar ett Grundläggandekaffeemachine-objekt och lagrar det i en variabel av typen BasicCoffeeMachine, kommer JVM att ringa brewCoffee-metoden på Grundläggandetkoffeemachine-klassen. Så, du kan bara brygga ett Kaffeval.FILTER_COFFEE.

underklass refererad som underklass

det andra scenariot är liknande. Men den här gången, jag instansiera en PremiumCoffeeMachine och referera till det som en PremiumCoffeeMachine. I det här fallet kallar JVM brewCoffee-metoden för PremiumCoffeeMachine-klassen, vilket ger stöd för Kaffeval.ESPRESSO.,

underklass refererad som superklassen

detta är det mest intressanta scenariot och huvudorsaken till att jag förklarar dynamisk polymorfism i sådana detaljer.

När du instansierar ett PremiumCoffeeMachine-objekt och tilldelar det till basiccoffeemachine coffeeMachine-variabeln är det fortfarande ett PremiumCoffeeMachine-objekt. Det ser bara ut som en Grundläggandekaffemaskin.

kompilatorn ser inte det i koden, och du kan bara använda de metoder som tillhandahålls av BasicCoffeeMachine-klassen., Men om du kallar brewCoffee metod på kaffebryggare variabel, JVM vet att det är ett objekt av typen PremiumCoffeeMachine och utför åsidosättas metoden. Detta kallas sen bindning.

sammanfattning

polymorfism är ett av kärnkoncepten på OOP-språk. Det beskriver konceptet att olika klasser kan användas med samma gränssnitt. Var och en av dessa klasser kan ge sin egen implementering av gränssnittet.

Java stöder två typer av polymorfism. Du kan överbelasta en metod med olika uppsättningar parametrar., Detta kallas statisk polymorfism eftersom kompilatorn statiskt binder metoden kallar till en specifik metod.

inom en arvshierarki kan en underklass åsidosätta en metod för dess superklass. Om du instansierar underklassen kommer JVM alltid att kalla den åsidosatta metoden, även om du kastar underklassen till sin superklass. Det kallas dynamisk polymorfism.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *