815338A Ohjelmointikielten periaatteet

Samankaltaiset tiedostot
Abstraktit tietotyypit ja olio-ohjelmointi

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

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

812341A Olio-ohjelmointi, I Johdanto

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

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

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

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

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

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

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

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

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

Mitä on periytyminen?

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

Olio-ohjelmointi Johdanto olio-ohjelmointiin

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

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

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

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

Java kahdessa tunnissa. Jyry Suvilehto

12. Monimuotoisuus 12.1

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

P e d a c o d e ohjelmointikoulutus verkossa

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Muutamia peruskäsitteitä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

812336A C++ -kielen perusteet,

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

12. Monimuotoisuus 12.1

1. Omat operaatiot 1.1

Rajapinta (interface)

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Olio-ohjelmointi Syntaksikokoelma

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

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

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

815338A Ohjelmointikielten periaatteet

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Olio-ohjelmointi Javalla

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

Virtuaalifunktiot ja polymorfismi

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

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

1. Olio-ohjelmointi 1.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

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

Pakkauksen kokoaminen

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

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

KOHDELUOKAN MÄÄRITTELY

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

C# olio-ohjelmointi perusopas

18. Abstraktit tietotyypit 18.1

4. Olio-ohjelmoinista lyhyesti 4.1

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

P e d a c o d e ohjelmointikoulutus verkossa

815338A Ohjelmointikielten periaatteet

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi,

2. Olio-ohjelmoinista lyhyesti 2.1

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Common Lisp Object System

Javan perusteita. Janne Käki

Kertaus: yleistys-erikoistus ja perintä

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

19. Olio-ohjelmointia Javalla 19.1

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

C++11 lambdat: [](){} Matti Rintala

11/20: Konepelti auki

12 Mallit (Templates)

A TIETORAKENTEET JA ALGORITMIT

Periytyminen. Luokat ja olio-ohjelmointi

16. Javan omat luokat 16.1

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

Oliot viestivät metodeja kutsuen

Ohjelmoinnin jatkokurssi, kurssikoe

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

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

Pakkauksen kokoaminen

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

UML Luokkakaavio 14:41

TIES542 kevät 2009 Oliokielten erityispiirteitä

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

HELIA 1 (14) Outi Virkki Käyttöliittymät ja ohjlmiston suunnittelu

20. Javan omat luokat 20.1

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

Tenttikysymykset. + UML- kaavioiden mallintamistehtävät

Luokkakaavion laatiminen

Transkriptio:

815338A Ohjelmointikielten periaatteet 2015-2016 V Abstraktit tietotyypit ja olioohjelmointi

Sisältö I. Abstraktit tietotyypit II. 1. Johdatus abstrakteihin tietotyyppeihin 2. Abstraktit tietotyypit Adassa 3. Abstraktit tietotyypit C++:ssa 4. Abstraktit tietotyypit Javassa 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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 2

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 3

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 4

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ä *x++=*y++ 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 5

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 6

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 7

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ä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 8

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 Kehittynyt myöhemmissä versioissa olio-ohjelmoinnin suuntaan C++, Java: luokkien avulla voidaan määritellä abstrakteja tietotyyppejä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 9

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 10

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ä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 11

V.I.2. Abstraktit tietotyypit Adassa (3) Esimerkki. package LINKITETTY_LISTA is end; type SOLMU; type OSOITIN is access SOLMU; type SOLMU is record end record; DATA: INTEGER; LINKKI: OSOITIN; package body LINKITETTY_LISTA is end; -- Paketin runko Pääsy myös SOLMU tyypin kenttiin DATA ja LINKKI 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 12

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 13

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) 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 14

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(); 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 15

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 16

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. 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 17

V.I.3 Abstraktit tietotyypit C++:ssa (6) *x++=*y++ 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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 18

V.I.4 Abstraktit tietotyypit Javassa V.I.4.1. Javan vertailua C++:aan *x++=*y++ 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ä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 19

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 20

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 21

V.II.1. Olio-ohjelmointi, Johdatus V.II.1.1. Hieman historiaa *x++=*y++ 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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 22

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 23

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) 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 24

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ä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 25

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ä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 26

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 27

V.II.2.3. Moniperiytyvyys (multiple inheritance) Luokalla voi olla monta kantaluokkaa Luokkahierarkia muodostaa verkon Jos ei sallita, luokkahierarkia puurakenne 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 28

V.II.2.4. Piilottaminen ja uudelleen määrittely *x++=*y++ 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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 29

V.II.3 Monimuotoisuus ja dynaaminen sidonta Monimuotoisuus (polymorfismi, polymorphism) *x++=*y++ 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 Tunnetaan myös alityyppimonimuotoisuutena (subtype polymorphism) 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 30

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 31

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! 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 32

V.2.4 Oliokielten suunnittelukysymyksiä 1. Onko kielessä muita tietotyyppejä kuin olioita? 2. Ovatko aliluokat aina perittyjen luokkien alityyppejä? 3. Sallitaanko moniperiytyminen? 4. Miten hoidetaan olioiden muistinvaraaminen ja - vapauttaminen? 5. Sidotaanko metodit aina dynaamisesti vai onko staattinen sidonta mahdollista? 6. Sallitaanko sisäkkäisiä luokkia? 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 33

V.II.5 Olio-ohjelmointi C++:ssa V.II.5.1. Periytyminen C++:ssa *x++=*y++ 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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 34

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 35

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 36

V.II.5.2. Dynaaminen sidonta C++:ssa Ei automaattista Esimerkki. class Kanta{ public: }; void kanta_funktio(){ cout << "Kanta"; } Koodi AliLuokka ali; kutsuja(&ali); tulostaa: Kanta Siis ei dynaaminen sidonta class AliLuokka:public Kanta{ public: void kanta_funktio(){ cout << Aliluokka"; } }; void kutsuja( Kanta *k) { k->kanta_funktio(); } 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 37

V.II.5.2. Dynaaminen sidonta C++:ssa (2) Muutos edelliseen: class Kanta{ public: }; virtual void kanta_funktio() { } cout << "Kanta"; Tulostuu Aliluokka *x++=*y++ Jäsenfunktio virtuaalinen -> sidotaan dynaamisesti Virtuaalisuus periytyy kaikkiin aliluokkiin 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 38

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 -> määriteltävä uudelleen puhtaasti virtuaaliset metodit 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 39

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 40

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 41

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()); } 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 42

V.II.6.3. Periytyminen ja dynaaminen sidonta Javassa Periytymisen tyyppiä ei voi 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 uudelleenmääritellä Javassa kaikki sidonta dynaamista, ohjelmoija ei voi muuttaa 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 43

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ä 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 44

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 815338A Ohjelmointikielten periaatteet, ADT ja olio-ohjelmointi 45