Polymorfismi

Wikipediasta
Siirry navigaatioon Siirry hakuun
Tämä artikkeli käsittelee olio-ohjelmoinnin käsitettä. Materiaalitieteen käsitettä käsittelee polymorfia.

Polymorfismi on olio-ohjelmoinnissa esiintyvä käsite, jonka mukaan aliluokat voivat määrittää oman yksilöllisen toimintansa ja silti jakaa saman toiminnallisuuden yläluokan kanssa.[1] Virtuaalimetodi on jäsenfunktio, joka voidaan määritellä uudelleen perityssä luokassa.[2] Bjarne Stroustrupin mukaan polymorfismi tarjoaa yhden rajapinnan eri tyyppisiin entiteetteihin.[3][4]Polymorfismin käsite pohjautuu biologian periaatteeseen, missä yhdellä eliöllä voi olla monia eri muotoja tai vaiheita.[5]

Perinteisesti tyypitetyt kielet, jotka perustuvat funktioille ja proseduureille, tukevat vain uniikkeja tyyppejä operandeilla.[6] Tämäntyyppiset kielet ovat monomorfisia: esimerkiksi Pascal on monomorfinen kieli.[6]

Polymorfiset kielet voidaan jakaa seuraavasti:[6]

  • Ad-hoc polymorfismi: Määrittää yleisen funktion mielivaltaiselle yksittäisesti määritettyjä tyyppejä sisältävälle joukolle
  • Parametrinen polymorfismi: Ei määritä yleistä rajapintaa joukolle, vaan käyttää erilaisia symboleja korvaamaan tai sijaistamaan eri arvoja.
  • Alatyyppipolymorfismi: Yhdellä parametrilla voidaan tarkoittaa tapauksia useista alaluokista, jotka ovat yhteydessä samaan yleiseen luokkaan.

Universaali polymorfismi toimii äärettömällä määrällä tyyppejä ja suorittaa samaa ohjelmakoodia kaikille tyypeille.[6] Niitä ovat parametrinen polymorfismi sekä alatyyppipolymorfismi.

Ad-hoc polymorfismi toimii rajatulla määrällä tyyppejä ja voidaan toteuttaa joukolla monomorfisia funktioita: eri tyypeille käytetään eri ohjelmakoodia.[6]

Historia[muokkaa | muokkaa wikitekstiä]

Kiinnostus polymorfiseen ohjelmointityyliin heräsi 1960-luvulla, ja 1970-luvulle mennessä ensimmäisiä polymorfisia koodeja alettiin käyttämään. Ad-hoc ja parametrinen polymorfismi esiteltiin ensimmäisen kerran Christopher Stracheyn “Fundamental Concepts in Programming Languages” ([7]) julkaisussa, jossa ne listattiin kahdeksi kahdeksi polymorfismin pääluokaksi. Ad-hoc oli Algol 68 ominaisuus, ja parametrinen polymorfismi oli ML ohjelmointikielen käyttämä tyyli. 1985 Peter Wegner ja Luca Cardelli esittivät käsitteen sisällyttävästä polymorfismista, joka mallintaa alatyyppejä ja periytymistä[8]. He mainitsivat Simulan olevan ensimmäinen tätä käyttävä ohjelmointikieli.

Tyypit[muokkaa | muokkaa wikitekstiä]

Ad-hoc polymorfismi

Ad-hoc -polymorfismi määrittää yhteisen rajapinnan mielivaltaiselle joukolle erikseen määriteltyjä tyyppejä. Se viittaa sellaisiin polymorfisiin funktioihin, joita voidaan soveltaa erityyppisiin argumentteihin, ja jotka käyttäytyvät eri tavalla riippuen argumentin tyypistä. Tämä tunnetaan myös nimellä funktion ylikuormitus tai operaattorin ylikuormitus. Termi ”ad-hoc” viittaa tosiasiaan, että tämän tyyppinen polymorfismi ei ole tyyppijärjestelmän perusominaisuus, eikä sitä ole siten tarkoitettu halventavaksi. [6]


Parametrinen polymorfismi

Parametrinen polymorfismi mahdollistaa funktion tai tietotyypin geneerisen kirjoittamisen, jotta arvoja pystytään käsittelemään tasaisesti tyypistä riippumatta. Se on tapa tehdä kielestä ilmaisuvoimaisempi säilyttäen täyden staattisen tyyppiturvallisuuden.

Parametrisen polymorfismin käsite koskee funktioita ja tietotyyppejä. Niitä funktioita, jotka voivat arvioida erityyppisiä arvoja tai soveltaa niitä kutsutaan polymorfisiksi funktioiksi. Tietotyyppi, joka voi näyttää olevan yleistettyä tyyppiä on taas polymorfinen tietotyyppi. Parametrinen polymorfismi on läsnä kaikkialla toiminnallisessa ohjelmoinnissa, jossa sitä kutsutaan usein vain ”polymorfismiksi”.[6]


Alatyyppipolymorfismi

Alatyyppipolymorfismiksi kutsutaan myös alatyypitykseksi tai inkluusiopolymorfismiksi. Jotkut kielet käyttävät alatyypityksen ideaa rajoittaakseen tyyppivalikoimaa, jota voidaan käyttää tietyssä polymorfismissa.

Oliopohjaiset ohjelmointikielet tarjoavat alatyyppipolymorfismin käyttämällä alaluokkaa (perinnöllisyys). Tyypillisissä toteutuksissa jokainen luokka sisältää virtuaalitaulukon – taulukon funktioista, joka toteuttaa luokkarajapinnan polymorfisen osan ­– ja jokainen objekti sisältää osoittimen luokkaansa, jota sitten tarkastellaan aina, kun polymorfinen menetelmä kutsutaan.[6]

Staattinen ja dynaaminen polymorfismi[muokkaa | muokkaa wikitekstiä]

Polyformismi voidaan erottaa siitä, milloin toteutus valitaan: staattisesti käännösaikana vai dynaamisesti ajon aikana. Nämä tunnetaan staattisena ja dynaamisena lähettämisenä ja niitä vastaavia polymorfismin muotoja kutsutaan staattiseksi polymorfismiksi ja dynaamiseksi polymorfismiksi.

Staattinen polymorfismi suoritetaan nopeammin, mutta se vaatii lisäkääntäjätukea. Lisäksi staattinen polymorfismi mahdollistaa suuremman staattisen analyysin käyttäjien, lähdekoodin sekä ihmislukioiden toimesta. Staattista polymorfismia esiintyy ad-hoc polymorfismissa ja parametrisessä polymorfismissa.[6][4]

Dynaaminen polymorfismi on joustavampaa, mutta hitaampaa. Esimerkiksi dynaamisesti linkitetty kirjasto voi toimia objekteissa tietämättä niiden täyttä tyyppiä. Dynaaminen polymorfismi on tavallista alatyyppipolymorfismissa.[4]

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. Polymorphism docs.oracle.com. Viitattu 19.2.2020. (englanniksi)
  2. Polymorphism cplusplus.com. Viitattu 19.2.2020. (englanniksi)
  3. Bjarne Stroustrup's C++ Glossary stroustrup.com. Viitattu 22.2.2020. (englanniksi)
  4. a b c Glenn G. Chappell: CS 331 Spring 2018 A Primer on Type Systems cs.uaf.edu. Viitattu 22.2.2020. (englanniksi)
  5. David Parsons: Inheritance, Polymorphism, and Interfaces, s. 159–195. London: Springer London, 2012. ISBN 978-1-4471-2478-8, 978-1-4471-2479-5. Teoksen verkkoversio (viitattu 15.6.2022).
  6. a b c d e f g h i Luca Cardelli & Peter Wegner: On Understanding Types, Data Abstraction, and Polymorphism (PDF) lucacardelli.name. Viitattu 22.2.2020. (englanniksi)
  7. Christopher Strachey: Higher-Order and Symbolic Computation, 2000, 13. vsk, nro 1/2, s. 11–49. doi:10.1023/a:1010000313106. ISSN 1388-3690. Artikkelin verkkoversio.
  8. Luca Cardelli, Peter Wegner: On understanding types, data abstraction, and polymorphism. ACM Computing Surveys, 10.12.1985, 17. vsk, nro 4, s. 471–523. doi:10.1145/6041.6042. ISSN 0360-0300. Artikkelin verkkoversio.