Olio-ohjelmointi
Käsitteitä

Olio (engl. object) on ohjelmiston rakenteellinen perusyksikkö. Se ei ole puhtaasti toiminnallinen tai puhtaasti tietoa säilyttävä, vaan se sisältää kummankin aspektin.
Olio-ohjelmointi jakautuu kahteen pääsuuntaukseen. Smalltalkin sanastossa oliot kommunikoivat keskenään lähettämällä ja vastaanottamalla viestejä. Viestin vastaanottaminen suorittaa määritellyn toiminnon vastaanottavassa oliossa.
Simulan tai C++:n sanastossa oliot kutsuvat toisensa jäsenfunktioita.
Oliota käytetään ohjelmistosuunnittelussa esittämään jonkun abstraktin tai reaalimaailman käsitteen ilmentymää ohjelmistossa. Oliokielillä laaditut ohjelmat koostuvat tavallisesti lukuisista olioista, joiden yhteistoiminnan tuloksena on ratkaisu ohjelmointiongelmaan. (kts. myös oliomalli)
Olio pystyy pyydettäessä tekemään sille ominaiset toiminnot, joita kutsutaan metodeiksi tai jäsenfunktioiksi kielestä riippuen. Metodi koostuu nimestä, mahdollisista parametreista ja toiminnan määrittelevästä rungosta. Olio tallettaa tietoja attribuutteihin.
Luokka (class) on määritelmä, joka kuvaa samanlaisten olioiden yhteisen rakenteen ja yhteisen käytöksen. Toisin sanoin luokka on ohje olion luomiselle ja sitä voidaan pitää olion tyyppinä. Olio on siten luokan ilmentymä, instanssi. Esimerkiksi henkilörekisteriohjelmassa määritellään luokka Henkilö, joka määrittelee millaista tietoa henkilöistä halutaan esittää ja millä tavalla näitä tietoja voidaan käsitellä. Ohjelman ajon aikana luokasta Henkilö luodaan olioita esittämään yksittäisiä henkilöitä. Olioiden toiminnallisuus määritellään useimmiten luokkien jäsenfunktioissa, jolloin kaikki saman luokan oliot sisältävät täsmälleen saman toiminnallisuuden tiedon käsittelyyn. On olemassa myös vähemmän tunnettuja prototyyppipohjaisia kieliä, jotka eivät tunne luokkakäsitettä.
Sidonta (binding) tarkoittaa sitä, miten symbolinen nimi yhdistetään dataan tai koodiin. Kaksi tapaa ovat myöhäinen ja varhainen sidonta. Joko kääntäjä tekee sen käännöksen yhteydessä, jolloin puhutaan staattisesta (varhainen) sidonnasta, tai se tapahtuu ajonaikana, jolloin kyseessä on dynaaminen (myöhäinen) sidonta. Jossain tilanteissa objektin tyyppi ei ole tiedossa vielä käännösaikana, jolloin on käytettävä dynaamista eli myöhäistä sidontaa.
Perintä (inheritance) mahdollistaa uusien luokkamääritysten tekemisen vanhojen määritysten pohjalta. Periyttämisen ansiosta on mahdollista käyttää uudestaan jo tehtyä ohjelmakoodia uusien luokkien pohjana. Periyttäminen mahdollistaa myös abstraktien perus-/kantaluokkien, joista periytetään useita luokkia, joita kaikkia voidaan käyttää samannimisillä funktioilla ja samoilla parametreilla kuin abstraktia kantaluokkaa, käytön. Itse abstraktista kantaluokasta ei voi luoda omia instansseja eli olioita new-operaattoria käyttäen. Oliot on luotava tässä tapauksessa abstraktin luokan lapsiluokista. Esimerkkinä abstrakti luokka voisi olla ajoneuvot-luokka, jolla olisi vuosimalli jäsenmuuttujana ja funktiona/metodina "rekisteröi"-toiminto. Lapsiluokkia voisivat olla esimerkiksi auto- ja laiva-lapsiluokat, jotka perivät ajoneuvoluokan jäsenmuuttujat ja funktiot. Perinnässä tärkeä huomionarvo on myös kantaluokan näkyvyysmääreiden asettaminen. Tämä johtunee siitä, että kantaluokan "private"-nimikkeellä määritetyt jäsenmuuttujat ja funktiot eivät periydy alempiin luokkiin. Näkyvyysmääreeksi on asetettava vähintään "protected", jotta lapsiluokka perii kyseisen jäsenmuuttujan tai funktion onnistuneesti. Periyttäminen ja abstraktien perusluokkien käyttö ovat oliopohjaisten kielien vahvimpia mutta myös vaikeimpia ominaisuuksia. Periyttäminen mahdollistaa abstraktit rajapinnat, joiden kautta voidaan käsitellä tuntemattomien tahojen rakentamia olioita ennalta määritellyllä tavalla.
Moniperintä (multiple inheritance), mahdollistaa uuteen luokkaan periyttämisen useista kantaluokista. Moniperintä on hyödyllistä tilanteessa, jossa "lepakko" sisältää "lentävä eläin"- ja "nisäkäs"-luokkien ominaisuudet. Moniperintä on tuettu kielissä kuten C++, Eiffel, OCaml ja Scala. C++ tukee virtuaalista moniperintää, jonka avulla periytyy vain yksi toteutus yhteisen kantaluokan jäsenistä. Kaikissa oliokielissä moniperintä ei ole mahdollista.
Eräissä kielissä moniperintä on vain rajatusti mahdollista. Rajattua moniperintää (interface eli rajapintaperintää) tukevat kielet kuten Ada, C# ja Java. JavaScript käyttää perimisen toteuttamiseen prototyyppejä.
Kapselointi (encapsulation) -termiä käytetään kahdessa merkityksessä. Ensimmäisen merkityksen mukaan kapseloinnin ideana on datan ja käyttäytymisen kokoaminen yhteen yksikköön, olioon. Toinen merkitys lisää tähän vielä tiedonpiilotuksen: olion sisäisiin muuttujiin ei (pääsääntöisesti) päästä suoraan käsiksi olion ulkopuolelta, jolloin ohjelmointivirheiden määrä vähenee.
Olion käyttäjän ei tarvitse tietää enää käyttövaiheessa sitä, miten olio toimii sisäisesti: riittää, kun tietää, miten oliota itseään käytetään ja miten olio käyttäytyy. Olion käyttäjät voivat käyttää oliota sen julkisen rajapinnan kautta (public interface). Olion luokkakuvauksessa voi olla myös yksityisiä muuttujia tai funktiota (private interface), jotka ovat vain olion itsensä käytettävissä.
Konstruktori (constructor, rakentaja) on metodi, joka alustaa luokan ilmentymät. RAII-konseptissa konstruktori myös varaa resurssit, jotka vapautetaan destruktorissa.
Destruktori (destructor, hajottaja tai purkaja) on metodi, joka vapauttaa olion varaamat resurssit.
Polymorfismi eli monimuotoisuus tarkoittaa sitä, että yhtä rajapintaa käytetään eri tyyppien käsittelyyn, tai yksi symboli edustaa monia tyyppejä. Esimerkiksi funktio tai datatyyppi voidaan kirjoittaa siten, että se voi käsitellä dataa riippumatta sen tyypistä.
Virtuaalimetodi on ominaisuus, jolla perintää käyttävä olio voi korvata yliluokassa olevan metodin toteutuksen toisella.
Luokkafunktiot esittävät luokan palveluja sekä operaatioita, jotka eivät kohdistu yksittäiseen olioon. Jos jäsenfunktiot ovat samankaltaiset määrittelyn kanssa lisätään static-avainsana, ei voida käyttää olemassa olevan olion jäsenmuuttujia eikä this-avainsanaa ja voi käyttää luokkamuuttujia. Luokalla voi olla useampi luokkafunktio, eikä luokkamuuttujan tarvitse aina olla julkinen.
Abstrakti luokka (Abstract class) on yksi olio-ohjelmoinnin peruskäsitteistä, joka mahdollistaa yleisten ominaisuuksien ja toimintojen jakamisen eri luokkien välillä. Abstrakti luokka ei pysty luomaan olioita, mutta se voi sisältää yhden tai useamman abstraktin metodin. Abstrakti metodi on määritelty luokassa, mutta sille ei ole toteutusta. Abstrakti luokka toimii pohjana lapsiluokille, joissa ne pitää toteuttaa.
Singleton (ainokainen) on suunnittelumalli, joka varmistaa että tietyn luokan oliolla on vain yksi instanssi ja että kaikkilla osilla on pääsy tähän samaan instanssiin. Singleton toteutetaan yleensä staattisella metodilla, joka palauttaa saman instanssin jokaiselle kutsujalle. Singleton on hyödyllinen erityisesti silloin, jos halutaan varmistaa että luokalla on vain yksi käyttötapaus.
Perintö (inheritance) on keskeinen olio-ohjelmoinnin käsite, joka tarkoittaa sitä, että uusi luokka voi periä vanhemman luokan toimintoja tai ominaisuuksia. Perintö auttaa koodin järjestelyssä ja ylläpitämisessä ja mahdollistaa sen uudelleenkäytön, jos niin halutaan.
Rajapinta (interface) on määritelmä siitä, miten luokka kommunikoi ja toimii muiden luokkien kanssa. Rajapinta määrittelee, mitä toimintoja ja ominaisuuksia luokka tarjoaa muille luokille. Rajapinta mahdollistaa erilaisten luokkien yhteensopivuuden ja helpottaa koodin ylläpitoa. Rajapinta ei siis ole itse toteutus vaan kertoo pelkästään, mitä toimintoja luokalla on. Rajapinnan toiminnot täytyy määritellä erikseen niissä luokissa, jotka käyttävät tätä pintaa.