sana polymorfismi käytetään eri yhteyksissä ja kuvataan tilanteita, joissa jotain tapahtuu useissa eri muodoissa. Tietojenkäsittelytieteessä se kuvaa käsitystä, jonka mukaan erityyppisiin esineisiin pääsee käsiksi saman käyttöliittymän kautta. Kukin tyyppi voi tarjota oman, riippumattoman täytäntöönpanon tämän käyttöliittymän. Se on yksi oliopainotteisen ohjelmoinnin (OOP) ydinkäsitteistä.,
jos pohdit, onko jokin esine polymorfinen, voit tehdä yksinkertaisen testin. Jos kohde läpäisee useita is-a-tai instanceof-testejä, se on polymorfinen. Kuten olen kuvaillut postauksessani perinnöstä, kaikki Java-luokat laajentavat Luokkaobjektia. Tämän vuoksi kaikki Jaavan kohteet ovat polymorfisia, koska ne läpäisevät vähintään kaksi tarkastusvaihetta.,
Erilaisia polymorfismi
Java tukee 2 tyyppisiä polymorfismi:
- staattinen tai käännettäessä
- dynamic
Staattinen polymorfismi
Java, kuten monet muut olio-ohjelmointi kielistä, voit toteuttaa useita menetelmiä saman luokka, joka käyttää sama nimi, mutta eri joukko parametreja. Tätä kutsutaan menetelmän ylikuormitukseksi ja se edustaa polymorfismin staattista muotoa.,
– parametri asettaa täytyy eroavat toisistaan vähintään yhden seuraavista kolmesta kriteereistä:
- Niillä on eri määrä parametreja, esim. yksi menetelmä hyväksyy 2-ja toinen 3-parametrit.
- muuttujien tyyppien on oltava erilaisia, esimerkiksi yksi menetelmä hyväksyy merkkijonon ja toinen pitkän.
- heidän täytyy odottaa parametrejä eri järjestyksessä, esimerkiksi yksi menetelmä hyväksyy merkkijonon ja pitkä ja toinen hyväksyy pitkän ja merkkijonon. Tällaista ylikuormitusta ei suositella, koska se vaikeuttaa API: n ymmärtämistä.,
useimmissa tapauksissa, jokainen näistä ylikuormitettu menetelmiä tarjoaa erilaisia, mutta hyvin samankaltaisia toimintoja.
eri parametrien vuoksi jokaisella menetelmällä on erilainen allekirjoitus. Näin kääntäjä voi tunnistaa, mitä menetelmää on kutsuttava ja sitoa sen menetelmäpuheluun. Tätä lähestymistapaa kutsutaan staattiseksi sitoutumiseksi tai staattiseksi polymorfismiksi.
katsotaan esimerkkiä.
yksinkertainen esimerkki staattinen polymorfismi
käytän samaa CoffeeMachine hankkeen käytin edellisessä virkaa tässä sarjassa. Sen voi kloonata https://github.com/thjanssen/Stackify-OopInheritance.,
BasicCoffeeMachine-luokka toteuttaa kaksi menetelmää nimellä brewCoffee. Ensimmäinen hyväksyy yhden parametrin Kahvinvalinnasta. Toisessa menetelmässä hyväksytään kaksi parametria, Kahvinvalinta ja int.
nyt, kun soitat johonkin näistä menetelmistä, annettu parametrien joukko tunnistaa menetelmän, jota on kutsuttava.
seuraavassa koodinäppäimessä kutsun menetelmää vain Kahvinvalintakohteella. Kääntövaiheessa Java-kääntäjä sitoo tämän menetelmäkutsun brewCoffee-menetelmään (CoffeeSelection selection).,
BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);
Jos tämä muuttaa koodia ja soita brewCoffee menetelmä, jossa CoffeeSelection objekti ja int, kääntäjä sitoo menetelmä puhelu toiselle brewCoffee(CoffeeSelection valinta, int number) – menetelmä.
Dynaaminen polymorfismi
Tämä muoto polymorfismi ei salli compiler määrittää toteutettu menetelmä. JVM: n on tehtävä se juoksuhetkellä.
perintöhierarkiassa alaluokka voi ohittaa yläluokkansa menetelmän. Sen avulla alaluokan kehittäjä voi muokata tai täysin korvata kyseisen menetelmän käyttäytymisen.,
se luo myös polymorfismin muodon. Molemmat super – ja alaluokan toteuttamat menetelmät jakavat saman nimen ja parametrit, mutta tarjoavat erilaisen toiminnallisuuden.
Katsotaan toinen esimerkki CoffeeMachine-projektista.
Menetelmä ylivoimainen perintö hierarkia
BasicCoffeeMachine luokka on yliluokka, että PremiumCoffeeMachine luokan.
molemmissa luokissa on käytössä brewCoffee-menetelmä(CoffeeSelection selection).,
Jos luet postauksen OOP-konseptin perinnöstä, tiedät jo brewCoffee-menetelmän kaksi toteutusta. BasicCoffeeMachine tukee vain Kahvinvalintaa.FILTER_COFFEE. PremiumCoffeeMachine-luokan brewCoffee-menetelmä lisää tukea Kahvinvalintaan.ESPRESSO. Jos se saa kutsua muita CoffeeSelection, se käyttää avainsanaa super siirtää puhelun yliluokka.,
Myöhään sitova
Kun haluat käyttää kuten perintö hierarkia projektin, sinun täytyy pystyä vastaamaan seuraavaan kysymykseen: mikä menetelmä on JVM soittaa?
, johon voidaan vastata vain ajallisesti, koska se riippuu siitä, mihin kohteeseen menetelmää kutsutaan. Viittauksen tyyppi, jonka näet koodissasi, on merkityksetön. Sinun täytyy erottaa kolme yleistä skenaariota:
- objekti on tyyppiä yliluokka ja saa viitata kuin yliluokka., Tässä postauksessa BasicCoffeeMachine-objektia kutsutaan Basiccoffeemachineksi.
- kohteesi on alaluokan tyyppi ja saa viittauksen alaluokkaan. Esimerkkinä tästä post, PremiumCoffeeMachine objekti saa viitataan PremiumCoffeeMachine.
- kohteesi on alaluokan tyyppi ja saa viittauksen superluokkaan. CoffeeMachine-esimerkissä PremiumCoffeeMachine-esinettä kutsutaan Basiccoffeemachineksi.
Yliluokka viitattu kuin yliluokka
ensimmäinen skenaario on melko yksinkertainen., Kun instanssia BasicCoffeeMachine kohteen ja tallentaa sen muuttujaan, jonka tyyppi BasicCoffeeMachine, JVM soittaa brewCoffee menetelmää BasicCoffeeMachine luokan. Voit siis hauduttaa vain Kahvinvalinnan.FILTER_COFFEE.
Alaluokka viitattu alaluokka
toinen skenaario on samanlainen. Mutta tällä kertaa, instantioi PremiumCoffeeMachine ja viittaan sitä PremiumCoffeeMachine. Tässä tapauksessa JVM kutsuu PremiumCoffeeMachine-luokkaan kuuluvaa brewCoffee-menetelmää, joka lisää tukea Kahvinvalintaan.ESPRESSO.,
Alaluokka viitattu kuin yliluokka
Tämä on kaikkein mielenkiintoinen skenaario ja tärkein syy, miksi selitän dynaaminen polymorfismi tällaisia yksityiskohtia.
Kun olet instanssia PremiumCoffeeMachine kohteen ja liittää sen BasicCoffeeMachine coffeeMachine muuttuja, se silti on PremiumCoffeeMachine kohde. Se näyttää vain Basiccoffeemachinelta.
kääntäjä ei näe, että koodi, ja voit käyttää vain menetelmiä esittänyt BasicCoffeeMachine luokan., Mutta jos soitat brewCoffee menetelmää coffeeMachine muuttuja, JVM tietää, että se on objekti, jonka tyyppi PremiumCoffeeMachine ja suorittaa yliohjatut menetelmä. Tätä kutsutaan myöhäiseksi sitomiseksi.
Yhteenveto
polymorfismi on yksi OOP-kielten ydinkäsitteistä. Se kuvaa käsitystä, että eri luokkia voidaan käyttää samalla käyttöliittymällä. Kukin näistä luokista voi tarjota Oman täytäntöönpanon rajapinnan.
Java tukee kahdenlaista polymorfismia. Voit ylikuormittaa menetelmän erilaisilla parametreilla., Tätä kutsutaan staattiseksi polymorfismiksi, koska kääntäjä sitoo staattisesti menetelmäkutsun tiettyyn menetelmään.
perintöhierarkiassa alaluokka voi ohittaa yläluokkansa menetelmän. Jos luot alaluokka, JVM aina soittaa yliohjatut menetelmä, vaikka valettu alaluokka sen yliluokka. Sitä kutsutaan dynaamiseksi polymorfismiksi.