11 rajapinnat n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
11. Rajapinnat PowerPoint Presentation
Download Presentation
11. Rajapinnat

Loading in 2 Seconds...

play fullscreen
1 / 18

11. Rajapinnat - PowerPoint PPT Presentation


  • 136 Views
  • Uploaded on

11. Rajapinnat. Sisällys. Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen sana. Johdanto. Rajapinnat (interface) muodostavat yhdessä taulukkojen ja luokkien kanssa Javan viitetyypit.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '11. Rajapinnat' - sancha


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
sis llys
Sisällys
  • Mitä rajapinnat ovat?
  • Kuinka ne määritellään ja otetaan käyttöön?
  • Moniperiytyminen rajapintojen avulla.
  • Varoituksen sana.
johdanto
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.
johdanto1
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.
johdanto2
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.
johdanto3
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ä.
johdanto4
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.
m rittely
Määrittely
  • Rajapinta määritellään varatulla sanalla interface:

publicinterface RajapinnanNimi extends

Rajapinta1, Rajapinta2, ... , RajapintaN {

// Vakioiden määrittelyt.

// Metodien otsikot.

}

missä kursivoidut osat ovat valinnaisia.

  • Esim. public interface Sahiseva { ... }
m rittely1
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.
m rittely2
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).
m rittely3
Määrittely
  • Nämä implisiittiset määreet voidaan jättää rajanpinnan attribuuttien ja metodien esittelyistä pois.
  • Esim. public final static double E = 2.72;

doubleE = 2.72;

  • Esim. public abstract void kertoma(int n);

void kertoma(int n);

toteutus
Toteutus
  • Luokka ilmaisee toteuttavansa rajapinnan varatulla sanalla implements. Yleisesti:

määreet class LuokanNimi extendsYliluokanNimiimplements Rajapinta1,Rajapinta2, ... , RajapintaN {

// Rajapintametodien toteutus täällä.

}

missä kursivoidut osat ovat valinnaisia.

  • Toteuttavan luokan jälkeläisineen katsotaan olevan myös toteutetun rajapinnan tyyppiä.
toteutus1
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ä.
tervehtiva rajapinta
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.
tervehtiva rajapinta1
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...");

}

}

moniperiytyminen
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.
moniperiytyminen1
Useasta rajapinnasta periytyvän rajapinnan toteutus siirtää moni-periytymisen epäsuorasti luokkahierarkiaan.

Moniperiytymisen voidaan ajatella myös tapahtuvan, kun luokka toteuttaa useita rajapintoja.

<<interface>>

R

<<interface>>

S

A

Moniperiytyminen

<<interface>>

R

<<interface>>

S

<<interface>>

T

Rajapinnan

toteutus ilmaistaan

katkoviivalla

piirretyllä kolmio-

kärkisellä nuolella.

UML:ssä rajapinta voidaan esittää

luokkasymboliin liitetyllä stereo-

tyypillä <<interface>>.

A

varoituksen sana
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.