*x++=*y++ 815338A Ohjelmointikielten periaatteet 2014 - 2015 V Abstraktit tietotyypit ja olioohjelmointi *x++=*y++ Sisältö I. Abstraktit tietotyypit 1. Johdatus abstrakteihin tietotyyppeihin 2. Abstraktit tietotyypit Adassa 3. Abstraktit tietotyypit C++:ssa 4. Abstraktit tietotyypit Javassa II. Olio-ohjelmointi 1. Johdatus olio-ohjelmointiin 2. Periytyvyys 3. Monimuotoisuus ja dynaaminen sidonta 4. Oliokielten suunnittelukysymyksiä 5. Olio-ohjelmointi C++:ssa 6. Olio-ohjelmointi Javassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 2 *x++=*y++ V.I.1 Abstraktit tietotyypit: Johdatus Abstract Data Type (ADT) Data-abstraktion väline Data-abstraktio: yhdistetään tietotyyppeihin operaatioita, joiden yksityiskohtia käyttäjän ei tarvitse tuntea Johtivat olio-ohjelmoinnin syntyyn Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 3 *x++=*y++ V.I.1.1. Abstraktin tietotyypin määritelmä Toteutettava kaksi ehtoa: 1. Tiedon kätkentä: Tyypin määrittelyn ja operaatioiden yksityiskohdat eivät näy tietotyypin ulkopuoliselle käyttäjälle Tyyppiin voidaan kohdistaa suoraan ainoastaan sellaisia operaatioita, jotka tyypin esittely sallii 2. Tiedon kapselointi: Tyypin esittely samoin kuin tietotyyppiin liittyvät operaatioiden esittelyt sijaitsevat yhdessä syntaktisessa yksikössä. Muut ohjelmayksiköt voivat muodostaa tämän tyypin muuttujia Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 4 *x++=*y++ V.I.1.1. Abstraktin tietotyypin määritelmä (2) HUOM! Määritelmän mukaan myös kielen sisäiset tietotyypit voivat olla abstrakteja. Tässä ADT:llä tarkoitetaan käyttäjän määrittelemää abstraktia tietotyyppiä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 5 *x++=*y++ V.I.1.2. Tiedon kätkentä Erittäin tärkeä periaate tietotyypin luotettavuuden kannalta Ainoastaan tietotyypin sisäiset operaatiot voivat väliaikaisesti rikkoa tyypin ilmentymän tilan, palauttavat sen ennen kontrollin siirtymistä käyttäjälle Helpottaa koodin ylläpitoa, koska ulospäin näkyvä rajapinta säilyy samana Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 6 *x++=*y++ V.I.1.3. Tiedon kapselointi Periaatteena koota data ja sitä käsittelevät operaatiot yhteen Helpottaa ohjelman loogista ja teknistä hallintaa Loogisesti yhteenkuuluvat operaatiot samaan yksikköön -> mentaalinen hallinta helpottuu Teknisesti helpottaa ohjelman kääntämistä Alisteisissa kielissä kapseloinnin toteuttaminen on ongelmallista Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 7 *x++=*y++ V.I.1.4. Historiaa lyhyesti ADT:t ensimmäiseksi SIMULA 67-kielessä Määriteltiin luokkana Sisälsi luokan muuttujat, aliohjelmien esittelyt sekä niiden koodin Luokassa määriteltyjä muuttujia ei piilotettu olion luovalta sovellukselta -> tiedon kätkennän toteutus puutteellinen ADT:t yleistyivät vasta useita vuosia SIMULA 67-kielen julkaisun jälkeen Useimmissa nykyisissä korkean tason kielissä voidaan käyttää abstrakteja tietotyyppejä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 8 *x++=*y++ I.1.5. ADT eri kielissä Pascal ja C: voidaan määritellä omia tyyppejä, mutta niihin ei voi kytkeä operaatioita -> ADT-toteutus mahdoton Ada: ADT ilman olioita C++, Java: luokkien avulla voidaan määritellä abstrakteja tietotyyppejä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 9 *x++=*y++ V.I.2. Abstraktit tietotyypit Adassa Adassa ADT:tä voidaan simuloida käyttämällä pakkauksia (packages) Pakkauksilla voidaan kapseloida tietoja Koostuvat kahdesta osasta, joita molempia myös kutsutaan pakkauksiksi: 1. Määrittelyosa (specification package) 2. Runko (body package) (vapaaehtoinen) Pakkausta käyttävä sovellus näkee aina vain määrittelyosan, mutta ei runkoa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 10 *x++=*y++ V.I.2. Abstraktit tietotyypit Adassa (2) Tiedon kätkentä: pakkauksen määrittelyosa voidaan jakaa julkiseen ja yksityiseen osaan Julkinen osa kokonaisuudessaan näkyvissä pakkauksen käyttäjille Yksityinen (private-määreellä merkitty) osa käyttäjältä piilotettu Oletus: tieto julkista HUOM! Pakkaukset eivät ole varsinaisia tietotyyppejä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 11 *x++=*y++ V.I.2. Abstraktit tietotyypit Adassa (3) Esimerkki. package LINKITETTY_LISTA is type SOLMU; type OSOITIN is access SOLMU; type SOLMU is record DATA: INTEGER; LINKKI: OSOITIN; end record; end; package body LINKITETTY_LISTA is -- Paketin runko end; Pääsy myös SOLMU –tyypin kenttiin DATA ja LINKKI Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 12 *x++=*y++ V.I.3 Abstraktit tietotyypit C++:ssa Data-abstraktio luokkien avulla Erot Adan abstraktiomalliin: C++ -luokat ovat tietotyyppejä (toisin kuin Adan pakkaukset) -> C++:ssa voidaan määritellä luokkatyyppisiä muuttujia Luokkien julkisiin (ei-staattisiin) jäsenmuuttujiin voidaan viitata ainoastaan luokan instanssin kautta, Adassa sisällytetyn pakkauksen muuttujiin voidaan viitata suoraan C++ :n luokka C-kielen tietueen (struct) laajennus Luokkien operaatiot = jäsenfunktiot Luokkamalli muistuttaa SIMULA 67:n mallia Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 13 *x++=*y++ V.I.3 Abstraktit tietotyypit C++:ssa (2) Luokan jäsenmuuttujien (member variables) ja funktioiden (member functions) näkyvyys Julkiset (public) Näkyvissä ulkopuolelle Suojatut (protected) Näkyminen liittyy periytymiseen Yksityiset (private) Näkyvät ainoastaan luokan sisällä ja luokan ystäväluokissa ja –funktioissa (friend classes, friend functions) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 14 *x++=*y++ V.I.3 Abstraktit tietotyypit C++:ssa (3) Viittaukset jäseniin Olio: pistenotaatio (.) Luokka olio; olio.funktio(); Osoitin olioon, nuoli (->) Luokka* p_olio; p_olio->funktio(); Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 15 *x++=*y++ V.I.3 Abstraktit tietotyypit C++:ssa (4) Staattiset jäsenmuuttujat kaikille luokan olioille yhteisiä jäsenmuuttujia Määritellään C++:ssa avainsanalla static Voidaan viitata suoraan ilman oliota luokan nimellä (Luokka::jäsen) Näkyvyyssäännöt myös voimassa Staattiset jäsenfunktiot (luokkametodit): kutsuttaessa ei tarvita luokasta oliota Avainsana static Luokkametodi voi viitata vain luokan staattisiin jäsenmuuttujiin tai staattisiin jäsenfunktioihin Näkyvyyssäännöt myös voimassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 16 *x++=*y++ V.I.3 Abstraktit tietotyypit C++:ssa (5) Muodostin (konstruktori, constructor) Kutsutaan aina olion luomisen yhteydessä Konstruktorin nimi on aina sama kuin luokan nimi Ei paluuarvoa Muodostinfunktioita voi olla useita -> parametrilistan perusteella päätellään, mitä muodostinta kutsutaan Hajotin (tuhoaja, destructor) Kutsutaan automaattisesti, kun olio tuhotaan Hajotin yksikäsitteinen, muoto ~LuokkaNimi() Yleensä hajottimeen vapautusoperaatiot dynaamisesti varatulle muistille jne. Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 17 *x++=*y++ V.I.3 Abstraktit tietotyypit C++:ssa (6) C++-olioiden muistinvaraus voi olla Staattinen, Pinodynaaminen, Kekodynaaminen Oliot vapautettava delete –operaattorilla C++:ssa olio voi käyttäytyä kuten mikä tahansa muuttuja Voi olla esim. globaali Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 18 *x++=*y++ V.I.4 Abstraktit tietotyypit Javassa V.I.4.1. Javan vertailua C++:aan Luokkamalli muistuttaa C++ -kielen mallia Oliot aina kekodynaamisia Ohjelmoija ei itse voi suoraan vapauttaa muistia, vaan roskien keruu huolehtii tästä Olion tuhoamisen yhteydessä tarpeelliset operaatiot ylikirjoittamalla finalize() –metodi Kaikki oliot perivät Object –luokalta Harvoin tarvitsee tehdä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 19 *x++=*y++ V.I.4.1. Javan vertailua C++:aan Oliot viitetyypin muuttujia Jäseniin viitataan pistenotaatiolla Kaikkien metodien ja tietotyyppien on kuuluttava johonkin luokkaan Metodien määrittely toteutetaan samassa luokassa, jossa metodi esitellään Voidaan määritellä sekä staattisia että ei-staattisia jäsenmuuttujia ja -metodeja Staattiset jäsenmuuttujat voidaan myös alustaa luokassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 20 *x++=*y++ V.I.4.2. Tiedon kätkentä Javassa Samat näkyvyysmääreet (public, protected ja private) kuin C++:ssa Merkityskin sama kuin C++:ssa Lisäksi oletusnäkyvyys = pakkausnäkyvyys (package scope) Jäsenet näkyvät pakkauksen sisällä Korvattu C++ -kielen ystäväluokat ja -funktiot, joita Javassa ei ole toteutettu Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 21 *x++=*y++ V.II.1. Olio-ohjelmointi, Johdatus V.II.1.1. Hieman historiaa 1980-luku: tarve ohjelmien uudelleenkäyttöön Abstraktit tietotyypit sopivat tarkoitukseen Abstraktien tietotyyppien ongelmia: Ei yleensä sovi sellaisenaan uuteen käyttöön Tyypit eivät muodosta hierarkkista rakennetta Ratkaisuksi olio-ohjelmointi Abstrakti tietotyyppi luokka, instanssi olio Luokka voidaan periä ja muokata sitä sekä lisätä ominaisuuksia Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 22 *x++=*y++ V.II.1.2. Olioparadigma Muutos aiempaan: tietoalkiot (oliot) ovat aktiivisia Ohjelman toiminta koostuu olioiden toisilleen lähettämistä viesteistä ja niihin saaduista vastauksista Olion tila: sen jäsenmuuttujien arvot Ihanne: toiset oliot eivät muuta tai lue suoraan olion tilaa Käytetään erillisiä saanti- ja asetusmetodeja Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 23 *x++=*y++ V.II.2. Periytyvyys (inheritance) Olio-ohjelmoinnin keskeisin käsite Kuvaa luokkien väliset suhteet Luokka, joka peritään = kantaluokka (base class) tai yliluokka (superclass) Perivä luokka = aliluokka (subclass) tai johdettu luokka (derived class) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 24 *x++=*y++ V.II.2. Periytyvyys (2) Kantaluokan olioiden käyttäytyminen siirtyy osaksi aliluokan olioiden käyttäytymistä Laajentaminen periytymisessä Uusien jäsenmuuttujien ja metodien lisääminen aliluokkaan Erikoistaminen periytymisessä Aliluokassa korvataan perittyjä määrittelyjä luokan omilla määrittelyillä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 25 *x++=*y++ V.II.2.1. Alityyppi Määritelmä: Tyypin T alityyppi on sellainen tietotyyppi S, johon voidaan soveltaa mitä tahansa tyyppiin T sovellettavaa operaatiota Tällöin tyyppi T on tyypin S ylityyppi Tärkeä kysymys: Ovatko aliluokat kantaluokan alityyppejä? Alityyppiperiaate: Alityypin olio voi ohjelmassa esiintyä missä tahansa sen ylityypin odotetaan esiintyvän. Pätee, jos aliluokalle sallitaan periytymisessä ainoastaan laajentaminen ja erikoistaminen Ei kaikissa kielissä kaikessa periytymisessä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 26 *x++=*y++ V.II.2.2. Tiedon kätkentä Näkyvyysmääreet säätelevät, mitkä kantaluokan ominaisuudet ovat aliluokan käytettävissä Usein julkisten jäsenten lisäksi vain suojatut jäsenet ovat näkyvissä aliluokassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 27 *x++=*y++ V.II.2.3. Moniperiytyvyys (multiple inheritance) Luokalla voi olla monta kantaluokkaa Luokkahierarkia muodostaa verkon Jos ei sallita, luokkahierarkia puurakenne Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 28 *x++=*y++ V.II.2.4. Piilottaminen ja uudelleen määrittely Aliluokassa määritellään jäsenmuuttuja, joka on samanniminen kuin peritty -> uusi määrittely piilottaa yliluokan muuttujan Aliluokan metodi, jolla on sama prototyyppi (sama nimi ja parametrit) kuin kantaluokan metodilla, määrittelee uudelleen (override) perityn metodin Yliluokan muuttujiin ja metodeihin voidaan yleensä viitata yliluokan nimen ja tarkoitukseen määrätyn operaattorin avulla Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 29 *x++=*y++ V.II.3 Monimuotoisuus ja dynaaminen sidonta Monimuotoisuus (polymorfismi, polymorphism) Tässä: saman operaattorin tai funktion sitominen erilaisiin toteutuksiin tilanteesta riippuen Olio-ohjelmoinnissa saavutetaan viestin dynaamisella sidonnalla metodin määrittelyyn Tämä mekanismi + alityyppiperiaate -> monimuotoiset muuttujat = tyyppi on kantaluokka, mutta muuttujat voivat olla jonkin aliluokan olioita Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 30 *x++=*y++ V.II.3 Monimuotoisuus ja dynaaminen sidonta (2) Dynaaminen sidonta Helpottaa ohjelmiston ylläpitoa: Muodostettaessa uusia luokkia, kantaluokkien koodia ei tarvitse perustoiminnoissa muuttaa Tapahtuu ohjelman suorituksen aikana -> tehottomampaa kuin staattinen sidonta -> joissakin oliokielissä ohjelmoija voi säätää, mitkä metodit sidotaan dynaamisesti Tyypintarkistus vaikeutuu, koska monimuotoinen muuttuja voi osoittaa tietotyyppiin, joka on tietotyypin määrittelemän tyypin alityyppi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 31 *x++=*y++ V.II.3 Monimuotoisuus ja dynaaminen sidonta (3) Abstrakti luokka Käytännöllinen, kun oliohierarkian kantaluokka niin yleinen, ettei siitä kannata muodostaa olioita Ei voi luoda instansseja Voi sisältää abstrakteja metodeja, joille määritelty ainoastaan prototyyppi, mutta ei lainkaan runkoa HUOM! Älä sekoita abstraktiin tietotyyppiin! Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 32 *x++=*y++ V.2.4 Oliokielten suunnittelukysymyksiä 1. 2. 3. 4. Onko kielessä muita tietotyyppejä kuin olioita? Ovatko aliluokat aina perittyjen luokkien alityyppejä? Sallitaanko moniperiytyminen? Miten hoidetaan olioiden muistinvaraaminen ja vapauttaminen? 5. Sidotaanko metodit aina dynaamisesti vai onko staattinen sidonta mahdollista? 6. Sallitaanko sisäkkäisiä luokkia? Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 33 *x++=*y++ V.II.5 Olio-ohjelmointi C++:ssa V.II.5.1. Periytyminen C++:ssa class derived_class_name: acces_mode base_class_name { <data members> <member functions> }; acces_mode jokin näkyvyysmääre (public, protected tai private) Säätelee, miten kantaluokan jäsenet näkyvät aliluokassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 34 *x++=*y++ V.II.5.1. Periytyminen C++:ssa (2) Tavallisimmin access_mode = public Aliluokassa näkyvät kaikki public ja protected – tyyppiset muuttujat ja funktiot, näkyvyysmääre on sama kuin kantaluokassa private –tyyppisiin jäseniin aliluokalla ei ole pääsyä Aliluokka on kantaluokan alityyppi access_mode =private access_mode = protected Näkyvyydet aliluokassa rajoitettuja Kummassakaan tapauksessa aliluokka ei ole kantaluokan alityyppi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 35 *x++=*y++ V.II.5.1. Periytyminen C++:ssa (3) C++:ssa ei yhteistä kantaluokkaa Voidaan tehdä luokka, jolla ei lainkaan jäseniä C++:ssa moniperiytyminen Luokkahierarkia verkkomainen Voi aiheuttaa nimitörmäyksiä Dynaamisen sidonnan toteuttaminen hankalampaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 36 *x++=*y++ V.II.5.2. Dynaaminen sidonta C++:ssa Ei automaattista Esimerkki. class AliLuokka:public Kanta{ class Kanta{ public: public: void kanta_funktio(){ void kanta_funktio(){ cout << ”Aliluokka"; cout << "Kanta"; } }; } void kutsuja( }; Kanta *k) { Koodi k->kanta_funktio(); AliLuokka ali; } kutsuja(&ali); tulostaa: Kanta Siis ei dynaaminen sidonta Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 37 *x++=*y++ V.II.5.2. Dynaaminen sidonta C++:ssa (2) Muutos edelliseen: class Kanta{ public: virtual void kanta_funktio() cout << "Kanta"; } }; Tulostuu Aliluokka { Jäsenfunktio virtuaalinen -> sidotaan dynaamisesti Virtuaalisuus periytyy kaikkiin aliluokkiin Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 38 *x++=*y++ V.II.5.3. Abstraktit luokat C++:ssa Luokka abstraktiksi sisällyttämällä luokkaan vähintään yksi puhtaasti virtuaalinen funktio (ei runkoa, merkitään nollaksi) Esimerkki class Kanta{ public: virtual void kanta_funktio() = 0; }; -> Luokasta abstrakti, eikä siitä voi luoda oliota Aliluokasta konkreettinen -> ylikirjoitettava puhtaasti virtuaaliset metodit Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 39 *x++=*y++ V.II.6. Olio-ohjelmointi Javassa Tarkastellaan eroja C++ -kieleen Puhtaampi oliokieli kuin C++ Ei täysin: primitiiviset tietotyypit eivät olioita Javassa jokainen luokka perii (extends) täsmälleen yhden luokan Ellei luokan ilmoiteta perivän toista luokkaa, se perii Object-luokan C++ :luokan ei tarvitse periä mitään Javan luokkahierarkia puumainen, C++:n verkkomainen Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 40 *x++=*y++ V.II.6.1. Rajapinnat (interfaces) Javassa Otettu moniperiytymisen korvaajaksi Eräänlaisia puhtaasti abstrakteja luokkia, jotka sisältävät ainoastaan metodien esittelyt Luokka toteuttaa (implements) rajapinnan Toteuttaa metodit (kaikki jos konkreeettinen luokka) Voi toteuttaa useita rajapintoja Rajapinnat voivat periä toisia rajapintoja Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 41 *x++=*y++ V.II.6.2. Abstraktit luokat Javassa Luokka erikseen määriteltävä abstraktiksi Abstrakti luokka voi sisältää abstrakteja metodeja Esimerkki public abstract class MessagePasser { public abstract void send(Object o); public void send(int i) { send(new Integer(i)); } public abstract Object receive(); public int receiveInt{ return(((Integer)this.receive()).intValue()); } } Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 42 *x++=*y++ V.II.6.3. Periytyminen ja dynaaminen sidonta Javassa Periytymisen tyyppiä ei voida Javassa säätää Periytyminen vastaa C++:n public-periytymistä public- ja protected-tyyppiset jäsenet aliluokassa näkyvissä ja niiden näkyvyydet säilyvät samana private-tyyppiset jäsenet eivät näy aliluokassa Aliluokka on aina kantaluokan alityyppi Periytymisketju voidaan katkaista final-määreellä Luokka final -> ei voida periä Metodi final -> ei voida ylikirjoittaa Javassa kaikki sidonta dynaamista, ohjelmoija ei voi muuttaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 43 *x++=*y++ V.II.6.4. Yhteenveto Javasta Javan luokkamalli pohjautuu C++ -kielen malliin, yksinkertaistettu vahvasti Moniperiytyminen korvattu rajapintojen käytöllä Kaikki luokat perivät yhteisen perusluokan (Object) Kaikki sidonta on dynaamista Periytymiseen liittyvät näkyvyysmääreet poistettu C++:ssa hankala järjestelmä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 44 *x++=*y++ V.II.6.4. Yhteenveto Javasta (2) C++ -kielen ystäväjärjestelmästä luovuttu Muutoksista C++:aan vain moniperinnän puuttumista voidaan arvostella rajoittavan ohjelmoijan työtä Sekä Java että C++ sallivat sisäkkäiset luokat Arvosteltu huonona ratkaisuna Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 45
© Copyright 2024