Lataa esitys
Esittely latautuu. Ole hyvä ja odota
JulkaistuAune Pääkkönen Muutettu yli 9 vuotta sitten
1
11. Rajapinnat 11.1
2
11.2 Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen sana.
3
11.3 Johdanto Rajapinnat (interface) muodostavat yhdessä taulukkojen ja luokkien kanssa Javan viitetyypit. Rajapinta muistuttaa abstraktia luokkaa. − Rajapinnasta ei voida muodostaa olioita. − Voidaan käyttää tunnuksen tyyppinä. Rajapinta on luokkaa abstraktimpi käsite. − Kaikkien metodien oltava abstrakteja ja julkisia. − Attribuutit ovat aina julkisia luokkavakioita.
4
11.4 Johdanto Rajapintaa ei voi liittää sellaisenaan luokka- hierarkiaan; jonkin luokan on toteutettava rajapinta. − Toteutus koostuu avainsanalla ilmaistavasta sopimuksesta ja rajapinnan metodien toteutuksista. Toteutus periytyy toteuttavan luokan jälkeläisille. Rajapinnan toteuttavan konkreettisen luokan on toteutettava kaikki rajapinnan metodit, ellei luokka peri osaa toteutetuista metodeista. − Abstraktissa luokassa ei ole pakko toteuttaa yhtäkään rajapinnan metodeista.
5
11.5 Johdanto Mikä tahansa luokka, millä tahansa luokkahierarkian tasolla voi toteuttaa rajapinnan. − Toteutuksen periytymistä kannattaa hyödyntää mahdollisuuksien mukaan. Toteutettu metodi voidaan kuormittaa ja korvata. Toteuttavan luokan ja sen jälkeläisten olioihin voidaan liittää toteutetun rajapinnan tyyppinen viite.
6
11.6 Johdanto Rajapinnat ovat hyödyllisiä, − kun halutaan määritellä liittymä ottamalla mahdollisimman vähän kantaa sen toteutukseen, − toteuttavan luokan ja sen jälkeläisten liittymän halutaan sisältävän aina tietyt piirteet, − piirteiden kokoaminen abstraktiin luokkaan ja niiden hyödyntäminen periytymisen kautta ei ole käytännöllistä tai − halutaan simuloida moniperiytymistä.
7
11.7 Johdanto Abstraktia luokkaa on syytä käyttää rajapinnan sijasta, kun sovelluksessa on samankaltaisia luokkia, joiden yhteiset piirteet voidaan koota luontevasti abstraktiin luokkaan ja periä siitä. − Valinta abstraktin luokan ja rajapinnan välillä on toisinaan vaikea tehtävä. Javan API:n luokkahierarkiat ovat matalia, mutta sen luokat toteuttavat tyypillisesti yhden tai useampia rajapintoja. − Esimerkiksi String -luokka periytyy suoraan Object - luokasta ja toteuttaa kolme rajapintaa.
8
11.8 Määrittely Rajapinta määritellään varatulla sanalla interface : public interface RajapinnanNimi extends Rajapinta1, Rajapinta2,..., RajapintaN { // Vakioiden määrittelyt. // Metodien otsikot. } missä kursivoidut osat ovat valinnaisia. Esim. public interface Sahiseva {... }
9
11.9 Määrittely Rajapintoja nimetään vaihtelevasti. Javan omia rajapintoja ovat esimerkiksi luokkamaisesti nimetty Comparator (substantiivi) ja ei-luokkamaisesti nimetty Comparable (adjektiivi). Rajapinta sijoitetaan luokkien tapaan nimensä mukaan nimettyyn tiedostoon. Esimerkiksi Sahiseva -rajapinta sijoitettaisiin Sahiseva.java - nimiseen tiedostoon. Yhdessä tiedostossa vain yksi rajapinta.
10
11.10 Määrittely Rajapintojen public - ja oletusnäkyvyys toimivat kuten luokissa. Rajapinta näkyy määreettä vain pakkauksessaan. Määritellään rajapinnatkin jatkossa julkisiksi public - määrettä käyttäen. Rajapinnan attribuutit ovat aina julkisia luokkavakioita ( public final static ). Rajapinnan metodit ovat puolestaan aina julkisia ja abstrakteja ( public abstract ).
11
11.11 Määrittely Nämä implisiittiset määreet voidaan jättää rajanpinnan attribuuttien ja metodien esittelyistä pois. Esim. public final static double E = 2.72; double E = 2.72; Esim. public abstract void kertoma( int n); void kertoma( int n);
12
11.12 Toteutus Luokka ilmaisee toteuttavansa rajapinnan varatulla sanalla implements. Yleisesti: määreet class LuokanNimi extends YliluokanNimi implements Rajapinta1, Rajapinta 2,..., RajapintaN { // Rajapintametodien toteutus täällä. } missä kursivoidut osat ovat valinnaisia. Toteuttavan luokan jälkeläisineen katsotaan olevan myös toteutetun rajapinnan tyyppiä.
13
11.13 Toteutus Esim. public class Kissa implements Sahiseva { // Tällä toteutetaan kaikki Sahiseva- // rajapinnan metodit. } Kaikki rajapintametodit on toteutettava luokassa: Näin taataan, että Kissa -luokka tarjoaa vähintään rajapinnan määrittelemät palvelut. Kissa -luokan oliot ovat nyt myös Sahiseva -tyyppiä.
14
11.14 Tervehtiva-rajapinta Käytetään edelleen esimerkkinä Nisakas-, Ihminen - ja Kissa -luokkia. Sekä ihminen että kissa tervehtivät tuttuja, mutta on myös nisäkkäitä, jotka eivät osaa tervehtiä. Tästä syystä tervehtimistoiminnallisuutta ei voi oikein sijoittaa Nisakas -luokkaan tai “väliluokkaan” TervehtivaNisakas, josta perittäisiin tervehtivät oliot. Ratkaistaan ongelma Tervehtiva -rajapinnalla, jonka esimerkiksi kissa ja ihminen toteuttavat.
15
11.15 Tervehtiva-rajapinta Tervehtiva.java: public interface Tervehtiva { // public - ja abstract -määreet saataisiin // myös automaattisesti. public abstract void moikkaa(); } Kissa.java: public class Kissa extends Nisakas implements Tervehtiva {... public void moikkaa() { System.out.println("Miu! Pusken jalkaa..."); }
16
11.16 Moniperiytyminen Javassa on tarjolla vain yksittäisperiytyminen: Object -luokka on kaikkien luokkien esi-isä eikä millään luokalla voi olla useampia yliluokkia. Rajapinta voi kuitenkin periä yhden tai useampia rajapintoja extends -avainsanan avulla, jolloin rajapinnoista voidaan muodostaa luokka- hierarkioiden tapaisia rajapintahierarkioita. Koska rajapinnalla voi olla useita ylirajapintoja, voidaan näin toteuttaa moniperiytyminen – tosin melko rajoitetussa muodossa.
17
11.17 Moniperiytyminen Useasta rajapinnasta periytyvän rajapinnan toteutus siirtää moni- periytymisen epäsuorasti luokkahierarkiaan. Moniperiytymisen voidaan ajatella myös tapahtuvan, kun luokka toteuttaa useita rajapintoja. > S > T > R A > S A > R UML:ssä rajapinta voidaan esittää luokkasymboliin liitetyllä stereo- tyypillä >. Rajapinnan toteutus ilmaistaan katkoviivalla piirretyllä kolmio- kärkisellä nuolella.
18
11.18 Varoituksen sana Rajapintaa hyödyntävien luokkien on toteutettava kaikki rajapinnan metodit Rajapintaa metodeilla laajennettaessa täytyy kaikkia rajapinnan toteuttavia luokkia muuttaa! Ratkaisuja: − Tulevaisuuden tarpeita voi huomioida “ylimääräisillä” metodeilla jo rajapintaa suunniteltaessa. − Vanhasta rajapinnasta voidaan periä extends -sanalla uusi laajempi rajapinta, jonka käyttö jää asiakkaiden päätettäväksi.
Samankaltaiset esitykset
© 2024 SlidePlayer.fi Inc.
All rights reserved.