Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat
Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi edullista, jos aliluokka voisi periä muuttujia ja metodeja useammalta yliluokalta. Rajapintojen avulla voidaan kiertää moniperinnän puute. Luokka perii yhden yliluokan. Luokka voi lisäksi toteuttaa yhden tai useampia rajapintoja. Toteutuksella tarkoitetaan, että rajapinnan määrittämät metodit kirjoitetaan rajapinnan toteuttavassa luokassa. Vesa Ollikainen & Outi Grotenfelt 2
Rajapinnat Käsitteellisesti rajapinta muistuttaa abstraktia luokkaa, jonka kaikki metodit ovat abstrakteja. Rajapinnat ovat kuitenkin luokkahierarkian ulkopuolella. Rajapinnat ovat koodin modularisuutta edistävä työväline. Rajapinnan toteutus takaa, että määrätyt metodit ovat käytössä kaikissa sen toteuttavissa luokissa. Rajapintojen käyttö vähentää toteutukseen tehtävien muutoksen säteilyä toteuttavan luokan ulkopuolelle. Vesa Ollikainen & Outi Grotenfelt 3
Rajapinta luokkakaaviossa Luokkakaaviossa luokan ja sen toteuttaman rajapinnan suhde ilmaistaan katkoviivanuolella. Kuvan esimerkki sallii myös laulamattomien lintujen toteutuksen. Vesa Ollikainen & Outi Grotenfelt 4
Esimerkki rajapinnan määrittelystä Rajapinta Laulava määrää, että kaikissa sen toteuttavissa luokissa on toteutettava metodi laula(). Rajapinta määritetään avainsanalla interface. Kunkin metodin määreinä on public abstract. Määreet ovat voimassa vaikkei niitä kirjoittaisi. Vesa Ollikainen & Outi Grotenfelt 5
Esimerkki rajapinnan määrittelystä.. Talitiainen- ja Varis-luokat ovat Lintu-luokan aliluokkia. Aliluokat toteuttavat Laulava-rajapinnan. toteutus ilmaistaan implements-avainsanalla jos toteutettavia rajapintoja on useita, ne erotetaan pilkuin. Vesa Ollikainen & Outi Grotenfelt 6
Esimerkki rajapinnan määrittelystä.. Myös Iskelmätähti-luokka toteuttaa Laulavarajapinnan. Vesa Ollikainen & Outi Grotenfelt 7
Esimerkki rajapinnan määrittelystä.. Yllä laulavat-taulukko sisältää viittauksia rajapintoihin. Linnuille on määritetty muni()-metodi. Tarvitaan tyypinmuunnos alaspäin. Vesa Ollikainen & Outi Grotenfelt 8
Muuttujat rajapinnoissa Rajapintoihin voi määrittää myös muuttujia. Muuttujien määreinä on aina public static final. Nämäkin määreet ovat voimassa ilman kirjoittamista. Vesa Ollikainen & Outi Grotenfelt 9
Rajapintojen toteutus ja perintä public interface Kissa extends Nisäkäs, Kotieläin { } int elämät = 7; void kehrää(); // Rajapinnat voivat periä toisia rajapintoja. periytyminen kuvataan extends-avainsanalla kuten luokkien tapauksessa. Rajapinta voi samanaikaisesti periä monta rajapintaa. extends-avainsanan perässä määritettävät perittävät rajapinnat erotetaan pilkuilla. Huomaa, että muuttuja elämät on automaattisesti static ja final. Metodi kehrää on automaattisesti public ja abstract. Vesa Ollikainen & Outi Grotenfelt 10
Rajapinnat ja tehdasluokka Rajapinnan toteuttavien olioiden luonti voidaan piilottaa tehdasluokkiin. Esimerkissä tehdasluokka luo Laulava-rajapinnan toteuttavia olioita. Vuoron perään Talitiainen- ja Varis-olioita. Vesa Ollikainen & Outi Grotenfelt 11
Rajapinnat ja tehdasluokka.. Testiluokka ei missään vaiheessa tiedä, mitä rajapinnan toteuttajia on olemassa. Tämä on eristetty tehdasluokkaan. Uuden linnun lisäys ei aiheuttaisi muutoksia testiluokkaan.. Vesa Ollikainen & Outi Grotenfelt 12
Sisäluokat Sisäluokka on toisen luokan sisällä määritelty luokka. Vain ulkoluokasta (luokasta, jonka sisällä sisäluokka on), pääsee käsiksi sisäluokkaan. Ulkoluokassa on tehtävä ilmentymä sisäluokan oliosta. Sisäluokasta pääsee käsiksi ulkoluokan muuttujiin ja metodeihin. Koskee myös private-määreellä suojattuja. Vesa Ollikainen & Outi Grotenfelt 13
Esimerkki Tarkastellaan esimerkkinä noppapelin toteutusta: Pelaajat heittävät vuoron perään noppaa. Se voittaa, joka saavuttaa ensimmäisenä sovitun pisterajan. Jos useampi pelaaja saavuttaa pisterajan samalla kierroksella, heistä ensimmäisenä heittänyt voittaa pelin. Määritetään Pelaaja-luokalle nyt sisäluokka Pistelaskuri. Sisäluokka pitää sisällään pelaajan pistemäärän ja siihen liittyvät metodit (mm. nopanheitolla kasvatuksen). Ulkoluokka hyödyntää sisäluokan palveluja. Vesa Ollikainen & Outi Grotenfelt 14
Esimerkki.. Pistelaskuri on sisäluokka. Vesa Ollikainen & Outi Grotenfelt 15
Esimerkki.. Vesa Ollikainen & Outi Grotenfelt 16
Esimerkki.. Vesa Ollikainen & Outi Grotenfelt 17
Anonyymi sisäluokka Anonyymi sisäluokka on nimetön rajapinnan toteuttava luokka, joka sijaitsee toisen luokan sisällä. Toteutus annetaan samalla, kun olio luodaan new-avainsanalla. Anonyymiä sisäluokkaa käytetään yleisesti tapahtumakäsittelyn ohjelmointiin. esimerkiksi koodi, joka suoritetaan, kun käyttöliittymäobjektille tehdään jotain (kuten painetaan painiketta). Vesa Ollikainen & Outi Grotenfelt 18
Anonyymi sisäluokka, esimerkki Anonyymi sisäluokka määrittää Laulavarajapinnan toteutuksen Vesa Ollikainen & Outi Grotenfelt 19
KIITOS! www.metropolia.fi www.facebook.com/metropoliaamk Outi.grotenfelt@metropolia.fi