Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Samankaltaiset tiedostot
Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Mitä on periytyminen?

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

16. Javan omat luokat 16.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Pakkauksen kokoaminen

15. Ohjelmoinnin tekniikkaa 15.1

2. Olio-ohjelmoinnin perusteita 2.1

4. Luokan testaus ja käyttö olion kautta 4.1

15. Ohjelmoinnin tekniikkaa 15.1

Rajapinta (interface)

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

2. Olio-ohjelmoinnin perusteita 2.1

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

18. Abstraktit tietotyypit 18.1

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Sisällys. 19. Unified Modeling Language (UML) Johdanto. Johdanto. Johdanto. Luokkakaavio:

19. Unified Modeling Language (UML)

14. Poikkeukset 14.1

Mikä yhteyssuhde on?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Sisällys. 15. Lohkot. Lohkot. Lohkot

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Pakkauksen kokoaminen

Javan perusteita. Janne Käki

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

14. Poikkeukset 14.1

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Java-API, rajapinnat, poikkeukset, UML,...

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

1. Omat operaatiot 1.1

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Olio-ohjelmointi Javalla

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Luokat ja oliot. Ville Sundberg

Sisältö. 22. Taulukot. Yleistä. Yleistä

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

Ohjelmoinnin jatkokurssi, kurssikoe

19. Olio-ohjelmointia Javalla 19.1

17. Javan omat luokat 17.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

815338A Ohjelmointikielten periaatteet

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

7. Oliot ja viitteet 7.1

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

4. Olio-ohjelmoinista lyhyesti 4.1

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

UML Luokkakaavio 14:41

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Hakemistojen sisällöt säilötään linkitetyille listalle.

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Java kahdessa tunnissa. Jyry Suvilehto

2. Olio-ohjelmoinista lyhyesti 2.1

Kertaus: yleistys-erikoistus ja perintä

Oliot viestivät metodeja kutsuen

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

Java-kielen perusteet

17. Javan omat luokat 17.1

Metodien tekeminen Javalla

Ohjelmistotekniikan menetelmät, luokkamallin laatiminen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IV Periytyminen ja monimuotoisuus

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

7. Näytölle tulostaminen 7.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmistojen mallintaminen. Luento 7,

Sopimuspohjainen olio-ohjelmointi

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

UML ja luokkien väliset suhteet

Transkriptio:

11. Rajapinnat 11.1

Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen avulla. Varoituksen sana. 11.2

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 kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi. Kaikkien metodien oltava abstrakteja ja julkisia. Attribuutit ovat aina julkisia luokkavakioita. 11.3

Johdanto Rajapintaa ei voi liittää sellaisenaan luokkahierarkiaan, vaan jonkin luokan on toteutettava rajapinta. Toteutus on koostuu avainsanalla ilmaistavasta sopimuksesta ja rajapinnan metodien toteutuksista yhdessä tai useammassa luokassa. <<interface>> R UML:n luokkakaaviossa rajapinta voidaan esittää luokkasymboliin liitetyllä stereotyypillä <<interface>>. A Sopimus rajapinnan toteutuksesta ilmaistaan katkoviivalla piirretyllä kolmiokärkisellä nuolella, joka lähtee sopimuksen tekevästä luokasta. 11.4

Johdanto Rajapinnan toteutuksesta sopivan konkreettisen luokan on toteutettava kaikki rajapinnan metodit. Abstrakti luokka voi sopia toteutuksesta, mutta siinä voidaan toteuttaa joko kaikki, vain osa tai ei yhtäkään rajapinnan metodeista. Abstraktin luokan konkreettisten jälkeläisten on toteutettava kaikki perimänsä abstraktit metodit. <<interface>> R m() K m() Konkreettisen luokan K on pakko toteuttaa metodi m. <<interface>> R m() Abstrakti luokka A tekee sopimuksen, mutta jättää metodin m toteutuksen konkreettisen luokan K vastuulle. A m() K m() 11.5

Johdanto Rajapinnan toteutus periytyy. Toteutettu metodi on käytettävissä toteuttavan luokan jälkeläisissä ja se voidaan kuorimittaa tai korvata. Rajapinnan kanssa sopimuksen tekevä luokan ja sen jälkeläisten katsotaan olevan myös rajapinnan tyyppiä. Luokan ja sen jälkeläisten olioihin voidaan liittää rajapinnan tyyppinen viite. Mikä tahansa luokka, millä tahansa luokkahierarkian tasolla voi toteuttaa rajapinnan. Toteutuksen periytymistä kannattaa hyödyntää mahdollisuuksien mukaan: mitä lähempänä juuriluokkaa toteutuksesta sovitaan, sitä laajempi osa hierarkiasta saa toteutuksen käyttöönsä. Toisinaan on järkevää toteuttaa rajapinta vain osassa luokkahierarkian lehtiluokkia. 11.6

Rajapintojen hyötyjä Rajapinnalla voidaan määritellä liittymä ottamalla mahdollisimman vähän kantaa liittymän toteutukseen. Pakottaa sopimuksen tekevään luokkaan ja sen jälkeläisille liittymän, jossa on aina tietyt piirteet. Vaihtoehto, kun piirteiden kokoaminen abstraktiin luokkaan ja niiden hyödyntäminen periytymisen kautta ei ole käytännöllistä. Rajapinnoilla voidaan simuloida moniperiytymistä. 11.7

Abstrakti luokka vai rajapinta? 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 moderniin tapaan matalia ja API-luokat toteuttavat tyypillisesti yhden tai useampia rajapintoja. Esimerkiksi String-luokka periytyy suoraan Object-luokasta ja toteuttaa kolme rajapintaa. 11.8

Määrittely Rajapinta määritellään varatulla sanalla interface. Yleisesti (kursivoidut osat ovat valinnaisia): public interface RajapinnanNimi extends Rajapinta1, Rajapinta2,..., RajapintaN { // Vakioiden määrittelyt. // Metodien otsikot. } Esimerkki. public interface Sahiseva { // Määritellään liittymä antamalla otsikot metodeille, // jotka mallintavat sähisevien olioiden käytöstä. } 11.9

Määrittely Rajapintojen näkyvyysmääreet toimivat pakkausten tasolla kuten luokissa. Määritellään toistaiseksi julkisiksi public-määrettä käyttäen. 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. 11.10

Määrittely Rajapinnan attribuutit ovat aina julkisia luokkavakioita ja metodit ovat puolestaan aina julkisia ja abstrakteja. Implisiittiset määreet voidaan jättää rajanpinnan attribuuttien ja metodien esittelyistä pois. Abstraktissa luokassa määreillä on aina merkitystä. Esimerkiksi public-määreen poistaminen muuttaa näkyvyyttä. Esimerkki. public final static double E = 2.72; double E = 2.72; public abstract void kertoma(int n); void kertoma(int n); 11.11

Toteutus Luokka ilmaisee toteuttavansa rajapinnan varatulla sanalla implements. Yleisesti: määreet class LuokanNimiextends YliluokanNimi implements Rajapinta1, Rajapinta2,..., RajapintaN { // Kaikkien rajapintametodien toteutus täällä, // jos luokka on konkreettinen. Abstrakti luokka voi // voi toteuttaa valinnaisen määrän metodeja. } Yllä kursivoidut osat ovat valinnaisia. 11.12

Toteutus Esimerkki. public class Kissa implements Sahiseva { // Tällä toteutetaan kaikki Sahiseva- // rajapinnan metodit, koska kissa on // konkreettinen. } Toteutuksen jälkeen kissat ovat sähiseviä. Kissa-luokan oliot voivat ilmaista sähinää kissoille ominaisella tavalla, mutta toisaalta on taattua, että kissa osaa aina sähistä juuri rajapinnassa luetelluilla metodeilla. Kissa-luokan olioihin voidaan liittää Sahiseva-tyyppisiä viitteitä. 11.13

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. 11.14

Eläin, nisäkäs, kissa ja rajapinta Eläin elossa, paino syö(), onkoiso() Kissa toteuttaa rajapinnan metodin. Piirteet: elossa, paino, syö(), onkoiso() << interface >> Tervehtivä moikkaa() Nisäkäs turkillinen syö(), onkoiso() Kissa väri, häntä ääntele(), kehrää() Piirteet: elossa, paino, syö(), onkoiso(), turkillinen Piirteet: elossa, paino, syö(), onkoiso(), turkillinen, väri, häntä, ääntele(), kehrää(), moikkaa() 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..."); } } 11.16

Moniperiytyminen Javassa on tarjolla vain yksittäisperiytyminen: Objectluokka 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. 11.17

Moniperiytyminen Useasta rajapinnasta periytyvän rajapinnan toteutus siirtää moniperiytymisen epäsuorasti luokkahierarkiaan. Moniperiytymisen voidaan ajatella myös tapahtuvan, kun luokka toteuttaa suoraan useita rajapintoja (esimerkiksi String-luokka). <<interface>> R <<interface>> S <<interface>> R <<interface>> S <<interface>> T A Rajapinta T perii rajapinnat R ja S. Konkreettinen luokka A toteuttaa T:n omat ja T:n perimät abstraktit metodit. A Konkreettinen Luokka A toteuttaa suoraan rajapintojen R ja S abstraktit metodit. 11.18

Varoituksen sana Rajapintaa hyödyntävien luokkien on toteutettava kaikki rajapinnan metodit, jolloin rajapintaa uusilla 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. 11.19