ordet polymorfisme bruges i forskellige sammenhænge og beskriver situationer, hvor der forekommer noget i flere forskellige former. I datalogi beskriver det konceptet, at objekter af forskellige typer kan fås adgang via den samme grænseflade. Hver type kan give sin egen, uafhængige implementering af denne grænseflade. Det er en af de centrale begreber i objektorienteret programmering (OOP).,
Hvis du spekulerer på, om et objekt er polymorf, kan du udføre en simpel test. Hvis objektet med succes passerer flere is – a eller instanceaf tests, det er polymorf. Som jeg har beskrevet i mit indlæg om arv, udvider alle Java-klasser klasseobjektet. På grund af dette er alle objekter i Java polymorfe, fordi de passerer mindst to instanceof checks.,
Forskellige typer af polymorfi
Java understøtter 2 former for polymorfi:
- statisk eller compile-time
- dynamisk
Statisk polymorfi
Java, ligesom mange andre objekt-orienterede programmeringssprog, giver dig mulighed for at gennemføre flere metoder inden for den samme klasse, der bruger det samme navn men med forskellige parametre. Det kaldes metode overbelastning og repræsenterer en statisk form for polymorfisme.,
parametersættene skal afvige i mindst et af følgende tre kriterier:
- de skal have et andet antal parametre, f.eks. en metode accepterer 2 og en anden 3 parametre.
- parametertyperne skal være forskellige, f.eks. en metode accepterer en streng og en anden en lang.
- de skal forvente parametrene i en anden rækkefølge, f.eks. en metode accepterer en streng og en lang og en anden accepterer en lang og en streng. Denne form for overbelastning anbefales ikke, fordi det gør API vanskeligt at forstå.,
i de fleste tilfælde giver hver af disse overbelastede metoder en anden, men meget lignende funktionalitet.
på grund af de forskellige sæt parametre har hver metode en anden signatur. Det gør det muligt for kompilatoren at identificere, hvilken metode der skal kaldes, og at binde den til metodekaldet. Denne fremgangsmåde kaldes statisk binding eller statisk polymorfisme.
lad os tage et kig på et eksempel.
et simpelt eksempel på statisk polymorfisme
Jeg bruger det samme Kaffemaskineprojekt som jeg brugte i de foregående indlæg i denne serie. Du kan klone det på https://github.com/thjanssen/Stackify-OopInheritance.,
basiccoffeemachine-klassen implementerer to metoder med navnet Bre .coffee. Den første accepterer en parameter af typen Kaffevalg. Den anden metode accepterer to parametre, en CoffeeSelection, og en int.
Når du kalder en af disse metoder, identificerer det angivne sæt parametre den metode, der skal kaldes.
i det følgende kodestykke kalder jeg kun metoden med et CoffeeSelection-objekt. På kompileringstidspunktet binder Java-kompilatoren dette metodeopkald til Bre .coffee(CoffeeSelection selection) – metoden.,
BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);
Hvis jeg ændrer denne kode og kalder Bre .coffee-metoden med et CoffeeSelection-objekt og en int, binder kompilatoren metodekald til den anden Bre .coffee(CoffeeSelection selection, int number) – metode.
dynamisk polymorfisme
denne form for polymorfisme tillader ikke kompilatoren at bestemme den udførte metode. JVM skal gøre det ved kørsel.inden for et arvshierarki kan en underklasse tilsidesætte en metode til dens superklasse. Det gør det muligt for udvikleren af underklassen at tilpasse eller helt erstatte opførslen af denne metode.,
det skaber også en form for polymorfisme. Begge metoder, implementeret af super-og underklasse, deler samme navn og parametre, men giver forskellige funktioner.
lad os se på et andet eksempel fra CoffeeMachine-projektet.
metode altoverskyggende i en arv hierarki
den BasicCoffeeMachine klasse er superklassen af PremiumCoffeeMachine klasse.
begge klasser giver en implementering af breffcoffee-metoden(CoffeeSelection selection).,
Hvis du læser indlægget om OOP-konceptarven, kender du allerede de to implementeringer af Bre .coffee-metoden. Den grundlæggende Kaffemaskine understøtter kun Kaffevalget.FILTER_COFFEE. Breffcoffee-metoden til PremiumCoffeeMachine-klassen tilføjer support til CoffeeSelection.ESPRESSO. Hvis det bliver kaldt med noget andet CoffeeSelection, bruger det nøgleordet super til at delegere opkaldet til superklassen.,
sen binding
Når du vil bruge et sådant arvshierarki i dit projekt, skal du være i stand til at besvare følgende spørgsmål: hvilken metode vil JVM-opkaldet?
det kan kun besvares ved kørsel, fordi det afhænger af det objekt, som metoden kaldes på. Typen af referencen, som du kan se i din kode, er irrelevant. Du skal skelne mellem tre generelle scenarier:
- dit objekt er af typen superklassen og bliver henvist til som superklassen., Så, i eksemplet med dette indlæg, en BasicCoffeeMachine objekt bliver refereret som en BasicCoffeeMachine.
- dit objekt er af typen af underklasse og bliver refereret som underklasse. I eksemplet med dette indlæg, en PremiumCoffeeMachine objekt bliver refereret som en PremiumCoffeeMachine.
- dit objekt er af typen af underklasse og bliver refereret som superklassen. I CoffeeMachine-eksemplet bliver et PremiumCoffeeMachine-objekt henvist til som en BasicCoffeeMachine.
superklasse refereres som superklassen
det første scenario er ret simpelt., Når du instantiere en BasicCoffeeMachine object og gemmer det i en variabel af typen BasicCoffeeMachine, JVM vil kalde brewCoffee metode på BasicCoffeeMachine klasse. Så du kan kun brygge en Kaffevalg.FILTER_COFFEE.
underklasse refereret som underklasse
det andet scenario er ens. Men denne gang, jeg instantiere en PremiumCoffeeMachine og henvise det som en PremiumCoffeeMachine. I dette tilfælde kalder JVM Bre .coffee-metoden for PremiumCoffeeMachine-klassen, som tilføjer understøttelse for CoffeeSelection.ESPRESSO.,
underklasse refereret som superklassen
Dette er det mest interessante scenarie og hovedårsagen til, at jeg forklarer dynamisk polymorfisme i sådanne detaljer.
når du instantierer et PremiumCoffeeMachine-objekt og tildeler det til basiccoffeemachine-variablen, er det stadig et PremiumCoffeeMachine-objekt. Det ligner bare en Grundlæggendecoffeemachine.
compileren kan ikke se det i koden, og du kan kun bruge de metoder, der leveres af basiccoffeemachine-klassen., Men hvis du kalder Bre .coffee-metoden på coffeeMachine-variablen, ved JVM, at det er et objekt af typen PremiumCoffeeMachine og udfører den tilsidesættede metode. Dette kaldes sen binding.
resum Polym
polymorfisme er et af kernebegreberne på OOP-sprog. Det beskriver konceptet, at forskellige klasser kan bruges med samme grænseflade. Hver af disse klasser kan give sin egen implementering af grænsefladen.Java understøtter to slags polymorfisme. Du kan overbelaste en metode med forskellige sæt parametre., Dette kaldes statisk polymorfisme, fordi kompilatoren statisk binder metodekaldet til en bestemt metode.inden for et arvshierarki kan en underklasse tilsidesætte en metode til dens superklasse. Hvis du instantierer underklassen, vil JVM altid kalde den tilsidesættede metode, selvom du kaster underklassen til dens superklasse. Det kaldes dynamisk polymorfisme.