Perintä ja kantaluokka-tyyppimuunnokset
Jokainen ohjelmoinnin perustekniikoihin tutustunut tietää varmasti, mitä olio-ohjelmoinnin käsitteisiin kuuluva “perintä” tarkoittaa perustasolla. On selvää, että oikein toteutettuna sillä on selkeä vaikutus monien muiden seikkojen ohessa esimerkiksi luodun ohjelmakoodin käytettävyyteen. Seuraavaksi esittelen yhden keinon, mitä voidaan hyödyntää perinnän avulla toteutetun luokkarakenteen ohjelmakoodin käytössä. Tutustuin oheiseen tekniikkaan lukemalla Ahti Haukilehdon kirjoittaman kirjan: “Visual C#.NET”. Tähän postaukseen luodut havainnollistavat koodinpätkät on kuitenkin kirjoitettu Javalla, joka on täysiverinen olio-ohjelmointikieli siinä missä C#.NET:kin.
Karkeasti sanottuna käsiteltävän tekniikan avulla voidaan siis suorittaa minkä tahansa luokkarakenteessa olevan luokan yksittäinen metodi ilman, että tarvitsee tietää minkä tyyppinen käsiteltävä luokka on. Pieninä ehtoina on kuitenkin, että käsiteltävien luokkien tulee olla periytetty (inherit) samasta kantaluokasta ja suoritettava metodi tulee löytyä kantaluokasta, jolloin sen tulee olla ylikuormitettu (override) periytetyissä luokissa. Tämän lisäksi itse koodilauseessa, missä suoritetaan satunnaisen olion ylikuormitetun metodin kutsu, tehdään implisiittinen kantaluokka-tyyppimuunnos (implicit type conversion), missä siis periytetyn luokan tyyppinen olio muunnetaan (cast) sen kantaluokan tyyppiseksi.
Seuraavan esimerkin tarkoituksena on havainnollistaa käsiteltävää tekniikkaa. Luodussa esimerkkisovelluksessa generoidaan JList-komponenttiin napin painalluksesta henkilöauto- tai kuorma-auto-olioita, mistä valintoja tekemällä voidaan tulostaa kulloinkin aktivoidun olion tiedot JTextArea-komponenttiin. Ongelmana sovelluksen koodin toteutuksessa on, että miten kulloinkin aktivoidun olion tietojen tulostus metodia kutsutaan, jos tutkimuksia siitä, minkä tyyppinen olio on, ei saa tehdä. Voit huomata sovelluksen toimintaperiaatteen alla olevasta kuvankaappauksesta.
Voit tarkastella alla olevista linkeistä esimerkkisovelluksen ohjelmakoodia. Luokka “cAjoneuvo” toimii kantaluokkana luokille “cHenkiloauto” ja “cKuormaauto”, joista sovellus generoi “ajoneuvo” listaan vietäviä olioita. Luokkien “Tiedot()” -metodin avulla suoritetaan tietojen tulostus ja esimerkkikoodeista voidaan huomata, että metodi on toteutettu kaikissa luokissa (periytetyissä luokissa ylikuormitettuna). Testiohjelman koodista kannattaa huomata tapahtuman “jLstAjoneuvotValueChanged” koodi, missä suoritetaan metodikutsu, joka vie olion tiedot alaosassa olevaan tekstikenttään..
cAjoneuvo cHenkiloauto cKuormaauto Testiohjelma
Lauseella “(cAjoneuvo)oList.get(intSelectedIndex)).Tiedot()” suoritettiin siis vuorossa olevan olion tietojen tulostus. Tutkimuksia siitä, minkä tyyppisen olion ArrayList-olio (oList) kulloinkin sisälsi, ei siis tarvittu. Erityisen hyödylliseksi tämä tekniikka tulisi silloin, kun eri tyyppisiä olioita olisi esimerkiksi useita kymmeniä.
Olioteorioiden ja -tekniikoiden ymmärtäminen on modernin ohjelmakoodin edellytys ja niiden avulla voidaan luoda helposti ylläpidettäviä ohjelmakokonaisuuksia. Toisaalta väärin käytettynä niistä voi olla haittaakin.
aihe: Olio-ohjelmointi

