Abstraktit tietotyypit ja olio-ohjelmointi

Koko: px
Aloita esitys sivulta:

Download "Abstraktit tietotyypit ja olio-ohjelmointi"

Transkriptio

1 Abstraktit tietotyypit ja olio-ohjelmointi Edellisessä osassa käsiteltiin aliohjelmia prosessiabstraktion välineenä. Prosessiabstraktio onkin vanhimpia ohjelmointikielten suunnittelukäsitteitä ja sisältynyt ohjelmointikieliin niiden alkutaipaleelta asti. Vähääkään edistyneempi ohjelmointi ei ole mahdollista ilman prosessiabstraktiota, koska vasta algoritmien ja operaatioiden abstrahointi tekee mahdolliseksi hallita suuria ohjelmakokonaisuuksia. Data-abstraktio seurasi luonnollisella tavalla prosessiabstraktiota, kun havaittiin, että on tarpeellista yhdistää tietotyyppeihin määrättyjä operaatioita, joiden yksityiskohtia ei tietotyypin käyttäjän kuitenkaan tarvitse tuntea. Data-abstraktio toteutetaan abstrakteja tietotyyppejä käyttämällä; nämä tietotyypit puolestaan johtivat olioohjelmoinnin syntyyn. Tässä osassa käsitellään sekä abstrakteja tietotyyppejä että olioohjelmointia. 1. Abstraktit tietotyypit Abstrakti tietotyyppi (abstract data type, ADT) on tietotyyppi, joka toteuttaa seuraavat ehdot ([Seb], kappale ): 1. Tyypin määrittelyn ja operaatioiden yksityiskohdat eivät näy tietotyypin ulkopuoliselle käyttäjälle. 2. Tyypin esittely samoin kuin tietotyyppiin liittyvät operaatioiden esittelyt sijaitsevat yhdessä syntaktisessa yksikössä. Muut ohjelmayksiköt voivat muodostaa tämän tyypin muuttujia. Ensimmäistä ehtoa sanotaan tiedon kätkennäksi (information hiding) tiedon ja toista kapseloinniksi (encapsulation). Kätkentään katsotaan kuuluvaksi myös se tietotyypin ominaisuus, että tyyppiin voidaan kohdistaa suoraan ainoastaan sellaisia operaatioita, jotka tyypin esittely sallii. Kapseloinnilla erotetaan tyypin rajapinta ja toteutuksen yksityiskohdat toisistaan: tyypin sisäiseen esitykseen ja operaatioihin voidaan tehdä muutoksia muiden tyypin käyttäjien kärsimättä, kunhan tyypin rajapinta ei muutu. Kapselointi helpottaa suuren ohjelman loogista ja teknistä hallintaa. Periaatteena on

2 koota data ja sitä käsittelevät operaatiot yhteen. Kun kootaan loogisesti yhteenkuuluvat operaatiot samaan yksikköön, myös niiden mentaalinen hallinta helpottuu. Teknisesti kapselointi helpottaa ohjelman kääntämistä, koska yhdestä syntaktisesta yksiköstä voidaan muodostaa erikseen käännettävä käännösyksikkö (compilation unit). Näin ollen voidaan tehdä muutoksia jonkin tietotyypin koodiin joutumatta kääntämään koko ohjelmaa erikseen. Samaan kokonaisuuteen liittyvien abstraktien tietotyyppien ja aliohjelmien sanotaan muodostavan moduulin, joka voidaan siis kääntää itsenäisesti ja esimerkiksi sijoittaa kirjastoon uudelleen käytettäväksi ohjelmayksiköksi. Sellaisissa ALGOL- pohjaisissa kielissä (esimerkiksi Pascal), joissa noudatetaan alisteista sisäkkäisiin ohjelman osiin perustuvaa ohjelmarakennetta, kapseloinnin toteuttaminen on ongelmallista. Tiedon kätkentä on erittäin tärkeä periaate tietotyypin luotettavuuden kannalta, sillä ainoastaan tietotyypin sisäiset operaatiot voivat väliaikaisesti rikkoa olion tilan, mutta palauttavat sen jälleen kuntoon ennen kontrollin siirtymistä tietotyypin käyttäjälle. Lisäksi koodin ylläpito helpottuu, mikäli tietotyypin joihinkin operaatioihin on tehtävä muutoksia, koska ulospäin näkyvä rajapinta säilyy silti samana. Huomaa, että myös kielen sisäiset tietotyypit voivat tämän määritelmän mukaan olla abstrakteja. Tässä käsitteellä tarkoitetaan kuitenkin käyttäjän määrittelemää abstraktia tietotyyppiä. Kirjan [Har] luvussa 9 käsitellään myös kapselointimekanismeja ja abstrakteja tietotyyppejä Abstraktit tietotyypit eri ohjelmointikielissä Abstraktit tietotyypit sisällytettiin ensimmäiseksi SIMULA 67 - kieleen ([Seb], kappale 11.4). Abstrakti tietotyyppi määriteltiin luokkana ja se sisälsi luokan muuttujat, aliohjelmien esittelyt sekä niiden koodin. Luokkien ilmentymät eli oliot luotiin pinodynaamisesti ja niihin voitiin viitata ainoastaan osoitinmuuttujan välityksellä. Luokassa määriteltyjä muuttujia ei piilotettu ilmentymän luovalta sovellukselta, joten tiedon kätkennän toteutus oli puutteellinen. Abstraktien tietotyyppien käyttö yleistyi ohjelmointikielissä vasta useita vuosia SIMULA 67-kielen julkaisun jälkeen. Useimmissa nykyisissä korkean tason ohjelmointikielissä voidaan käyttää abstrakteja tietotyyppejä; erityisesti tämä koskee olio-ohjelmointikieliä.

3 Adassa abstrakteja tietotyyppejä voidaan simuloida käyttämällä pakkauksia (packages), joiden avulla tietoja voidaan kapseloida. Pakkaukset koostuvat kahdesta osasta, joita molempia myös kutsutaan pakkauksiksi. Nämä osat ovat määrittelyosa (specification package) ja runkoon (body packege), jotka molemmat esitellään samannimisinä pakkauksina, mutta runko-osassa lisätään määre body pakkauksen nimen eteen. Pakkausta käyttävä sovellus näkee aina vain määrittelyosan, mutta ei runkoa. Pakkauksella ei välttämättä olekaan runko-osaa lainkaan. Tiedon kätkentä voidaan Adassa toteuttaa jakamalla määrittelyosa julkiseen ja yksityiseen osaan. Julkinen osa on kokonaisuudessaan näkyvissä pakkauksen käyttäjille, mutta yksityinen, private -määreellä merkitty osa on käyttäjältä piilotettu. Jollei määrettä ole annettu, tieto on julkista. Esimerkiksi linkitetyn listan määrittelevä tietotyyppi 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; sallisi pääsyn myös SOLMU -tyypin muuttujiin DATA ja LINKKI. Mikäli SOLMU haluttaisiin näkyviin paketin ulkopuolelle, mutta piilottaa sen yksityiskohdat, voitaisiin pakkaus määritellä seuraavasti: package LINKITETTY_LISTA is

4 type SOLMU is private; -- Listan käsittelymetodit private type SOLMU; type OSOITIN is access SOLMU; type SOLMU is record DATA: INTEGER; LINKKI: OSOITIN; end record; end LINKITETTY_LISTA; package body LINKITETTY_LISTA is -- Paketin runko end LINKITETTY_LISTA; Nyt SOLMU -tyypin esitys on piilotettu, mutta tyyppi näkyy kuitenkin pakkauksen ulkopuolelle. Pakkaus otetaan käyttöön ohjelmassa käyttämällä with ja use -lauseita: with LINKITETTY_LISTA; use LINKITETTY_LISTA; procedure LISTA_OHJELMA is OMA_SOLMU: SOLMU; begin -- listan käsittelyä end LISTA_OHJELMA; Tässä with -lause sisällyttää ulkoisen pakkauksen ohjelmaan, ja use -lauseella poistetaan tarve viitata pakkaukseen muuttujiin ja operaatioihin pakkauksen nimellä,

5 ts. voidaan käyttää nimeä SOLMU nimen LINKITETTY_LISTA.SOLMU asemasta. Reino Kurki-Suonion kirjan [Kur] luvussa 6 on hieman tarkemmin käsitelty Adan pakkauksia. Pascalissa ja C-kielessä on mahdollista määritellä omia tyyppejä, mutta niihin ei voi kytkeä operaatioita, joten abstraktien tietotyyppien toteuttaminen näissä kielissä on mahdotonta. Sen sijaan C++ -kielessä samoin kuin Javassa voidaan luokkien avulla määritellä abstrakteja tietotyyppejä. Seuraavassa perehdytään hieman C++:n ja Javan luokkien käyttöön nimenomaan data-abstraktion toteuttajana. Varsinaiseen olioohjelmointiin palataan tuonnempana Abstraktit tietotyypit C++ -kielessä C++ rakennettiin liittämällä C-kieleen oliotuki; data-abstraktio toteutetaan luokkien avulla (ks. [Strou], luku 10). Erona Adan abstraktiomalliin on, että C++ -kielen luokat ovat tietotyyppejä toisin kuin Adan pakkaukset, jotka sisältävät tietotyyppien määrittelyjä. C++:ssa voidaan siis määritellä luokkatyyppisiä muuttujia; luokkien julkisiin jäsenmuuttujiin voidaan viitata ainoastaan luokan instanssin kautta, kun taas Adassa sisällytetyn pakkauksen muuttujiin voidaan viitata suoraan (kunhan käytetään use-lausetta). C++:n luokka on C-kielen tietueen eli struct-tyypin laajennus. C-kielen structia voidaan pitää luokan erikoistapauksena, jossa ei ole lainkaan operaatioita ja kaikki jäsenmuuttujat ovat julkisia. Luokkien operaatioita kutsutaan jäsenfunktioiksi. C++ - kielen luokkamalli muistuttaa SIMULA 67:n mallia, jossa luokka oli myös tietotyyppi. Luokan jäsenmuuttujat (member variables)ja -funktiot (member functions) voivat olla julkisia (public), suojattuja (protected) tai yksityisiä (private). Julkinen jäsenmuuttuja tai -funktio on näkyvissä ulkopuolelle, ts. luokan instanssin (olion) haltija voi suoraan viitata olion jäsenmuuttujaan tai kutsua jäsenfunktiota. Yksityiset jäsenmuuttujat ja - funktiot näkyvät ainoastaan luokan sisällä ja luokan ystäväluokissa ja -funktioissa. Ystäväfunktio on luokan ulkopuolella määritelty funktio, jolla on pääsy luokan yksityiseen alueeseen. Tällaisia funktioita tarvitaan määriteltäessä luokkien välistä yhteistä rajapintaa tilanteessa, jossa olisi määriteltävä sama metodi useampiin eri

6 luokkiin. Ystäväfunktio on siis luokan ulkopuolinen funktio, jota ei kutsuta luokan jäsenfunktiona. Kokonainen luokkakin voidaan määritellä toisen luokan ystäväksi: tällöin ystäväluokan jäsenfunktiot voivat käsitellä luokan yksityisiä osia kuten omiaan. Ystävyys ei ole automaattisesti molemminpuolista. Jos halutaan antaa luokalle pääsy sen ystäväluokan yksityisiin osiin, on luokka määriteltävä ystäväksi toiselle luokalle. Sisäkkäisten luokkien tapauksessa on useimmiten syytä määritellä ulompi luokka sisemmän luokan ystäväksi, oletusarvoisesti ulommalla luokalla ei ole pääsyä sisemmän luokan yksityisiin osiin. Suojattujen osien näkyminen liittyy periytymiseen; tähän palataan olio-ohjelmointia koskevassa osassa. Jos jäsenmuuttujat määritellään staattisiksi, ne luodaan jo käännösvaiheessa ja niiden elinaika päättyy vasta ohjelman loputtua. Luokan staattisten jäsenmuuttujien näkyvyyttä voidaan säädellä samoilla määreillä kuin ei-staattisten muuttujienkin. Luokan ulkopuolella niihin voidaan viitata (silloin, kun se näkyvyyden kannalta on sallittua) luokan nimen ja näkyvyysoperaattorin (::) avulla. Myös funktiot voidaan määritellä staattisiksi, jolloin ne voivat käsitellä vain staattisia tietotyyppejä. Tällaisia funktioita voidaan kutsua, vaikka luokasta ei olisikaan luotu instanssia. Staattisten funktioiden näkyvyys määräytyy kuten muidenkin jäsenfunktioiden. Luokan staattiset tietotyypit tulee alustaa luokan ulkopuolella, jotta niitä voidaan käyttää luokan funktioissa. C++ -kielen funktioiden joukossa on kaksi erikoisasemassa olevaa funktiotyyppiä: muodostimet (konstruktorit, constructors) ja hajottimet (destruktorit, destructors). Muodostinta kutsutaan olion luomisen ja hajotinta olion tuhoamisen yhteydessä. Muodostimen nimi on aina sama kuin luokan nimi eikä sillä ole paluuarvoa; muodostinfunktioita voi olla useita (ts. niitä voidaan ylikuormittaa) jolloin olion luomisen yhteydessä parametrilistan perusteella päätellään, mitä muodostinta kutsutaan. Hajotin on sen sijaan yksikäsitteinen ja sen muoto on ~LuokkaNimi()

7 Hajotinta kutsutaan automaattisesti, kun olio tuhotaan. Yleensä hajottimeen on syytä kirjoittaa vapautusoperaatiot dynaamisesti varatulle muistille jne. Seuraavassa esimerkissä on toteutettu pinorakenne kokonaisluvuille: class Pino private: // Jäsenmuuttujat int *pino_osoitin; int koko; int huippu; public: // Muodostin Pino (int pinonkoko) pino_osoitin = new int [pinonkoko]; koko = pinonkoko; huippu = -1; // Hajotin ~Pino () delete [] pino_osoitin; // Muut metodit void push(int luku) /* funktion runko */ int pop( ) /* funktion runko */ int top( ) /* funktion runko */ int empty( ) /* funktion runko */ ;

8 Tässä versiossa jäsenfunktioiden koodit on kirjoitettu esittelyn yhteyteen. Toinen tapa kirjoittaa luokan määrittelyyn ainoastaan funktioiden otsikot ja kirjoittaa funktioiden rungot erikseen seuraavasti: // Tiedostossa Pino.h class Pino private: int *pino_osoitin; int koko; int huippu; public: Pino (int pinonkoko); ~Pino (); void push(int luku); int pop( ); int top( ); int empty( ); ; // Tiedostossa Pino.cpp #include "Pino.h" Pino::Pino (int pinonkoko) pino_osoitin = new int [pinonkoko]; koko = pinonkoko; huippu = -1; Pino::~Pino () delete [] pino_osoitin; void Pino::push(int luku) /*funktion runko */ int Pino::pop( ) /* funktion runko */ int Pino::top( ) /* funktion runko */ int Pino::empty( ) /* funktion runko */ Usein koodi kirjoitetaan niin, että hyvin lyhyet funktiot kirjoitetaan kokonaan määrittelyyn ja pitempien funktioiden toteutukset erilliseen kooditiedostoon. Sekä muodostinta että hajotinta voidaan periaatteessa myös eksplisiittisesti kutsua koodissa, mutta useimmiten siihen ei ole mitään syytä. C++ -ohjelmassa olioille voidaan varata muisti kaikilla samoilla tavoilla kuin muuttujillekin. Oliot voivat siis olla staattisia

9 muuttujia (myös näkyvyydeltään globaaleja), pinodynaamisia tai kekodynaamisia, esimerkiksi // Globaali olio Pino pino_glob; int main() // Pinodynaaminen olio Pino pino_stack; pino_stack.push(12); int luku=pino_stack.pop(); // Kekodynaaminen olio Pino *pino_heap = new Pino(); pino_heap->push(12); luku=pino_heap->pop(); delete pino_heap; Kekomuistista varattavat oliot on ohjelmoijan itsensä vapautettava deleteoperaattorilla Abstraktit tietotyypit Javassa Javan luokkamalli muistuttaa C++ -kielen mallia, mutta joitakin merkittäviä poikkeuksia on. Javan oliot ovat aina kekodynaamisia ja ne luodaan new-operaattorilla, pinosta ei koskaan varata olioita. Javassa ohjelmoija ei itse voi suoraan vapauttaa muistia, vaan roskien keruu huolehtii tästä. Ohjelmoija voi kuitenkin vaikuttaa siihen esimerkiksi asettamalla olioviitteen arvoon null, jolloin roskien kerääjä aikanaan vapauttaa varatun muistin, ellei olioon ole muita viitteitä. Roskienkerääjän voi myös ohjelmallisesti aktivoida (ks. [Arn], kappale 15.2). Javassa voidaan tehdä olion tuhoamisen yhteydessä tarpeelliset operaatiot ylikirjoittamalla finalize() -metodi, jonka kaikki oliot perivät Object-luokalta. Java-koodissa tätä tarvitsee vain harvoin kuitenkaan tehdä, koska muistivuotoja ei tapahdu. (Javan luokkiin voi tutustua esimerkiksi teoksen [Arn] luvusta 2). Javan olioihin viitataan niiden nimillä, jotka ovat viittaustyypin (referenssityypin) muuttujia. Javassa ei käytetä osoitinoperaattoreita, mikä merkitsee, ettei Javan

10 primitiivisten tietotyyppien muistiosoitteita voida käsitellä, koska ne ovat arvotietotyyppejä. Olioiden jäseniin viitataan pistenotaatiolla. Javassa ei ole luokan ulkopuolista elämää: kaikkien metodien ja tietotyyppien on kuuluttava johonkin luokkaan. Myös metodien määrittely toteutetaan samassa luokassa, jossa metodi esitellään (paitsi abstraktien metodien tapauksessa; tähän palataan olio-ohjelmoinnin yhteydessä). Javan luokissa voidaan C++-kielen tapaan määritellä sekä staattisia että eistaattisia jäsenmuuttujia ja -metodeja. Luokan staattiset jäsenet allokoidaan käännösvaiheessa. Erotuksena C++-kieleen staattiset jäsenmuuttujat voidaan myös alustaa luokassa, jolloin niitä voidaan suoraan käyttää luokan metodeissa. Luokan ei-staattisia jäseniä käytetään luokan ilmentymän kautta. Jokaisella ilmentymällä on omat kopionsa luokassa määritellyistä ei-staattisista jäsenmuuttujista. Staattisista jäsenmuuttujista, luokkamuuttujista (class variable), on kustakin vain yksi kopio, jota kaikki ilmentymät käyttävät. Luokan jäsenmetodit, luokkametodit (class method) allokoidaan myös staattisesti. Myös luokkametodeja voidaan käyttää ilman dynaamisesti luotua oliota luokan nimen ja pisteoperaattoria avulla. Javan tiedonkätkentä perustasolla on hieman monimutkaisempi kuin C++ -kielessä. Javassa voidaan käyttää samoja näkyvyysmääreitä (public, protected ja private) kuin C++ -kielessäkin ja niiden merkityskin on sama. Java-luokassa voidaan kuitenkin jättää näkyvyysmääre myös antamatta, jolloin käytetään oletusnäkyvyytenä pakkausnäkyvyyttä (package scope), joka poikkeaa kolmen luetellun määreen näkyvyydestä ([Arn], kappale 10.2). Javassa voidaan nimittäin luokkia koota pakkauksiksi (ja juuri näistä liitetään ohjelmaan luokkia kaikille Java-ohjelmoijille tutulla import-lauseella). Oletusnäkyvyyden jäsenet näkyvät pakkauksen sisällä tai, ellei pakkausta ole määritelty, samassa hakemistossa. Tällä mekanismilla on korvattu C++ - kielen ystäväluokat ja -funktiot, joita Javassa ei ole toteutettu. Mikäli luokan halutaan näkyvän pakkauksen ulkopuolella, se on määriteltävä public-tyyppiseksi ja se on sijoitettava tiedostoon, jonka nimi on sama kuin luokan nimi (lisättynä java - tarkenteella).

11 2. Olio-ohjelmointi luvun aikana havaittiin, että ohjelmistokehityksessä tuottavuutta voidaan parhaiten lisätä ohjelmien uudelleenkäytöllä. Abstraktit tietotyypit ovat ominaisuuksiensa (datan kapselointi ja tiedon kätkentä) ansiosta sopivia yksiköitä kierrättämiseen. Yleensä olemassaolevat tietotyypit eivät kuitenkaan täysin sovi uuteen käyttökohteeseensa, vaan niihin olisi tehtävä pieniä muutoksia ja lisäyksiä. Tämä voi olla työläs ja hankala operaatio, eivätkä abstraktit tietotyypit sinänsä muodosta välttämättä hierarkkista rakennetta, jota saatetaan tarvita ohjelman rakentamisessa. Tämä ongelma voidaan ratkaista, mikäli abstraktit tietotyypit voivat periä aiemman tietotyypin ominaisuudet ja datan. Näin saadaan aiempi koodi uudelleen käytettyä ja sen ominaisuuksia voidaan muokata sekä lisätä uuteen tietotyyppiin uusia ominaisuuksia. Tämä on olio-ohjelmoinnin perusta. Oliokielten abstrakteja tietotyyppejä kutsutaan luokiksi ja luokkien instansseja olioiksi. Olio-ohjelmointi keksittiin jo luvulla, mutta yleistyi vasta luvulla ja kohosi sittemmin johtavaksi ohjelmointiparadigmaksi. Oliotuki on lisätty myöhemmin moniin sellaisiin kieliin, joista se on alun perin puuttunut. Olio-ohjelmoinnin opettelu vaatii prosessisuuntautuneen ohjelmoinnin koulukunnan edustajalta muutosta ajattelutavassa. Prosessisuuntautuneessa ajattelumallissa ohjelman aktiiviset operaatiot (sijoituslauseet ja aliohjelmat) käsittelevät passiivisia tietoalkioita. Olio-ohjelmoinnissa tietoalkiot eli oliot ovat itse aktiivisia ja ohjelman toiminta koostuu olioiden toisilleen lähettämistä viesteistä ja niihin saaduista vastauksista. Viestit voivat muuttaa olion tilaa, millä tarkoitetaan olion jäsenmuuttujien kulloisiakin arvoja. Olio-ohjelmoinnin ihanteisiin kuuluu, että toiset oliot eivät voi yleensä muuttaa tai lukea suoraan olion tilaa, vaan siihen käytetään erillisiä saanti- ja asetusmetodeja. Tässä esityksessä luokkien jäsenfunktioita kutsutaan metodeiksi; terminologiassa saattaa esiintyä vaihtelua eri lähteissä, esimerkiksi Stroustrup ([Strou], s. 310) tarkoittaa metodilla luokan virtuaalista jäsenfunktiota. Tässä esitellään aluksi olio-ohjelmoinnin peruskäsitteitä, kuten periytyvyys, monimuotoisuus ja dynaaminen sidonta, minkä jälkeen tarkastellaan, kuinka kyseiset

12 ominaisuudet on toteutettu C++- ja Java -kielissä. Näistä poikkeavia oliokieliä on runsaasti, mutta niihin ei tässä yhteydessä perehdytä. Sebestan ([Seb]) luvussa 12 on jonkin verran käsitelty myös muita oliokieliä. Myös Harsu esittelee kirjansa [Har] luvussa 10 joitakin olio-ohjelmointikieliä Periytyvyys Periytyvyys (inheritance) on olio-ohjelmoinnin keskeisin käsite, kuten jo aiemmin on käynyt ilmi; periytyvyys yhdessä koostamisen kanssa kuvaa olio-ohjelmoinnin abstraktien tietotyyppien eli luokkien väliset suhteet. Luokkaa, joka peritään, kutsutaan usein kantaluokaksi (base class) tai yliluokaksi (superclass) ja perivää luokkaa sen aliluokaksi (subclass) tai johdetuksi luokaksi (derived class). Joskus myös perittävää luokkaa sanotaan vanhemmaksi ja perivää luokkaa sen lapseksi. Periytymisessä kantaluokan olioiden käyttäytyminen siirtyy osaksi aliluokan olioiden käyttäytymistä. Aliluokka voi sekä laajentaa (extend) että erikoistaa (specialize) kantaluokan käyttäytymistä. Laajentamisella tarkoitetaan uusien jäsenmuuttujien ja metodien liittämistä aliluokkaan. Erikoistaminen tarkoittaa, että aliluokassa korvataan perittyjä määrittelyjä luokan omilla määrittelyillä (yleensä tämä tarkoittaa kantaluokan metodin korvaamista aliluokan omalla versiolla). Tyypin T alityypiksi kutsutaan sellaista tietotyyppiä S, johon voidaan soveltaa mitä tahansa tyyppiin T sovellettavaa operaatiota. Tällöin tyyppiä T sanotaan tyypin S ylityypiksi. Tärkeä kysymys oliokielessä on, ovatko aliluokat kantaluokan alityyppejä. Mikäli aliluokalle sallitaan periytymisessä ainoastaan yllä mainitut laajentaminen ja erikoistaminen, aliluokka on kantaluokan alityyppi ja siihen soveltuu ns. Alityyppiperiaate: Alityypin olio voi ohjelmassa esiintyä missä tahansa sen ylityypin odotetaan esiintyvän. Tämä on yleensä voimassa olio-ohjelmointikielissä. Joissakin kielissä voidaan kuitenkin myös rajoittaa periytyviä ominaisuuksia, jolloin aliluokka ei ole enää kantaluokan alityyppi.

13 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. Näkyvyysmääreitä on käsitelty yleisesti aiemmin; tuonnempana tutustutaan näkyvyysmääreiden käyttöön C++ ja Java -kielissä. Mikäli luokalla voi olla monta kantaluokkaa, sanotaan että ohjelmointikieli tukee moniperiytymistä (multiple inheritance). Jos moniperiytymistä ei sallita, luokkahierarkia voidaan esittää puurakenteena, moniperiytymisen tapauksessa hierarkia muodostaa verkon. C++ tukee moniperiytymistä, Javassa peritään aina ainoastaan yksi luokka. Jos aliluokassa määritellään jäsenmuuttuja, jonka nimi on sama kuin periytymisen yhteydessä saadulla muuttujalla, piilottaa määrittely yliluokan vastaavan muuttujan. Aliluokan metodi, jolla on sama otsikko kuin kantaluokan metodilla, määrittelee uudelleen (override) perityn metodin. Yliluokan piilotettuihin muuttujiin ja uudelleenmääriteltyihin metodeihin voidaan yleensä viitata yliluokan nimen ja tarkoitukseen määrätyn operaattorin avulla. Tyypillisiä uudelleenmääriteltäviä metodeja ovat olion tulostamiseen liittyvät metodit Monimuotoisuus ja dynaaminen sidonta Monimuotoisuus (polymorfismi, polymorphism) tarkoittaa saman operaattorin tai funktion sitomista erilaisiin toteutuksiin tilanteesta riippuen. Olio-ohjelmoinnissa tämä tarkoittaa yleensä monimuotoisuutta, joka saavutetaan viestin dynaamisella sidonnalla metodin määrittelyyn. Tämä mekanismi yhdessä edellä mainitun alityyppiperiaatteen kanssa sallii muodostaa monimuotoisia muuttujia, ts. muuttujia joiden tyyppi on kantaluokka, mutta sen muuttujat voivat olla jonkin aliluokan olioita. Mikäli aliluokan metodi määrittelee uudelleen kantaluokassa olevan metodin ja monimuotoisen muuttujan metodia kutsutaan, kutsu sidotaan oikean luokan metodiin. Dynaaminen sidonta on varsin hyödyllinen ominaisuus ohjelmiston ylläpidon kannalta. Kun muodostetaan uusia luokkia, kantaluokkien koodiin ei tarvitse tehdä perustoiminnoissa muutoksia. Esimerkiksi olion tulostaminen tapahtuu dynaamisen

14 sidonnan avulla aina oikein, vaikka perusluokka ei sisältäisikään tulostusmahdollisuutta uudelle luokalle, koska ohjelmassa kutsutaan oikean luokan tulostusmetodia, vaikka olioon viittaava muuttuja olisi kantaluokan tyyppinen. Dynaaminen sidonta tapahtuu luonnollisesti ohjelman suorituksen aikana (muuten ei mahdollista tietää, minkä tyyppiseen olioon muuttuja viittaa), joten se on tehottomampaa kuin staattinen, käännösaikana tapahtuva sidonta. Tästä syystä joissakin oliokielissä kaikki sidonta ei automaattisesti ole dynaamista, vaan ohjelmoija voi itse säätää, mitkä metodit sidotaan dynaamisesti. Edelleen, dynaaminen sidonta asettaa haasteita kielen tyypintarkistukselle, sillä monimuotoinen muuttuja voi osoittaa tietotyyppiin, joka on tietotyypin määrittelemän tyypin alityyppi, joten on päätettävä, missä vaiheessa dynaamisesti sidottavan metodin tyypintarkistus tehdään. Mikäli kieli on vahvasti tyypitetty, tyypintarkistus olisi tehtävä staattisesti. Metodikutsujen yhteydessä tarvitaan kahdentyyppistä tarkistusta: parametrien tyyppien vastaavuus parametrilistaan ja paluuarvon tyypin vastaavuus odotettuun paluuarvotyyppiin. Toinen mahdollisuus on luopua staattisesta tyypintarkistuksesta ja tarkistaa tyypit dynaamisesti metodikutsun yhteydessä. Yleensä oliohierarkian kantaluokka kannattaa suunnitella niin, että se sisältää täsmälleen kaikkien aliluokkien tarvitsemat operaatiot. Joissakin tapauksissa tällainen kantaluokka on niin yleistä muotoa, ettei siitä ole tarkoituksenmukaista muodostaa olioita. Tällöin luokasta voidaan tehdä abstrakti luokka, josta ei voi luoda instansseja. Abstrakti luokka voi sisältää abstrakteja metodeja, joille on määritelty ainoastaan prototyyppi, mutta ei lainkaan runkoa. (Joissakin esityksissä abstrakteja metodeja kutsutaan [puhtaasti] virtuaalisiksi metodeiksi.) Tyypillinen esimerkki tämän kaltaisesta tapauksesta olisi ohjelma, jossa käsiteltäisiin yksinkertaisia tasokuvioita. Kaikilla tasokuvioilla on pinta-ala ja kaikki tarvitsevat metodin, joka piirtää kuvion näytölle. Muut ominaisuudet saattavat vaihdella kuvion tyypistä riippuen; tällöin voisi olla tarkoituksenmukaista määritellä abstrakti kantaluokka, jossa on jäsenmuuttuja kuvaamaan pinta-alaa ja metodi piirtämiselle. Kutakin tasokuviotyyppiä kohti kirjoitettaisiin oma luokka, joka perii kantaluokan ja määrittelee uudelleen piirtometodin.

15 2.3. Oliokielten suunnittelukysymyksiä Edellä esitettyjen asioiden yhteenvetona voidaan todeta, että olio-ohjelmointikielen suunnittelijan on otettava kantaa ainakin seuraaviin kysymyksiin. 1. Onko kielessä muita tietotyyppejä kuin olioita? Esimerkiksi Smalltalk on puhtaasti oliokieli, kun taas Javassa ja C++:ssa esiintyy perustietotyyppejä, joiden ilmentymät eivät ole olioita. 2. Ovatko aliluokat aina perittyjen luokkien alityyppejä? 3. Sallitaanko moniperiytyminen? 4. Miten hoidetaan olioiden muistinvaraaminen ja -vapauttaminen? Esimerkiksi Javassa olio voidaan varata ainoastaan kekomuistista, kun C++:ssa olio ei eroa muista muuttujista tältäkään osin. 5. Sidotaanko metodit aina dynaamisesti vai onko staattinen sidonta mahdollista? 6. Sallitaanko sisäkkäisiä luokkia? 3. Olio-ohjelmointi C++ ja Java -kielissä Tässä osassa tarkastellaan edellä mainittuja käsitteitä konkreettisesti tutkimalla, miten ne ilmenevät C++- ja Java-kielissä. Vaikka oliomalli molemmissa kielissä on perustaltaan samankaltainen, on kielten välillä myös huomattavia eroja. Muihin oliokieliin lukija voi perehtyä esimerkiksi Loudenin teoksesta ([Lou], luku 9) ja Sebestan kirjasta ([Seb], luku 12) C++ Jo abstraktien tietotyyppien yhteydessä esiteltiin C++ -kielen luokkamalli. Tässä perehdytään periytymisen ja myöhäisen sidonnan toteutukseen C++:ssa. Asiaa on mahdotonta käsitellä kattavasti tässä yhteydessä, kiinnostunut lukija voi perehtyä C++:n oliomalliin syvällisemmin esimerkiksi Stroustrupin ([Strou]) kirjan osasta II.

16 C++-kielessä periytyminen kirjoitetaan seuraavasti: class derived_class_name: acces_mode base_class_name <data members> <member functions> ; Tässä access_mode voi olla jokin näkyvyysmääre, ts. public, protected tai private, joista yleisin käytännön ohjelmoinnissa on public. C++-kielen näkyvyysmääreillä säädellään, miten kantaluokan jäsenet näkyvät aliluokassa. Normaalisti (access_mode on public) aliluokassa näkyvät kaikki public- ja protected-tyyppiset muuttujat ja funktiot ja niiden näkyvyysmääre on sama kuin kantaluokassa. Sen sijaan private-tyyppisiin jäseniin aliluokalla ei ole pääsyä. Tällöin aliluokka on kantaluokan alityyppi ja tämän tyypin ilmentymä voi esiintyä missä tahansa yhteydessä, jossa kantaluokkaa käytetään. Toisaalta private-näkyvyysmäärettä käyttämällä ainoastaan aliluokan jäsenet ja ystävät saavat pääsyn kantaluokan public- ja protected-tyyppisiin jäseniin. Käytettäessä protected-määrettä, lisäksi aliluokasta perityt luokat ja niiden ystävät saavat pääsyn kantaluokan public- ja protected -tyyppisiin jäseniin. Kummassakaan tapauksessa aliluokka ei ole kantaluokan alityyppi. Esimerkki. Olkoon ohjelmassa määritelty luokat class Kanta public: void kanta_julkinen_funktio() cout << "Olen kantaluokan julkinen funktio" << endl; ; class AliLuokka:public Kanta ; ja funktio

17 void kutsuja(kanta k) k.kanta_julkinen_funktio(); Nyt ohjelma AliLuokka ak; ak.kanta_julkinen_funktio(); kääntyy, koska AliLuokka on Kanta -luokan alityyppi ja sen olion kautta funktion kanta_julkinen_funktio näkyvyys on public. Näin sitä voidaan kutsua. Jos kuitenkin vaihdetaan aliluokka muotoon tai class AliLuokka:private Kanta ; class AliLuokka:protected Kanta ; koodi ei käänny, koska AliLuokka-luokassa perityn funktion näkyvyys ei ole public. Näin ollen AliLuokka-luokka ei enää olekaan Kanta-luokan alityyppi. Samasta syystä koodi AliLuokka ak; kutsuja(ak); kääntyy ensimmäisessä tapauksessa, mutta kahdessa jälkimmäisessä koodi ei ole sallittua, vaikka jätettäisiin funktion kutsuja runko tyhjäksikin (AliLuokka -luokan oliota ei voi muuttaa Kanta -luokan olioksi). C++ -kielessä moniperiytyminen on mahdollinen, mistä johtuu, että luokkahierarkia on verkkomainen. Moniperiytyminen aiheuttaa myös sen, että aliluokassa voi tulla nimitörmäyksiä, kun samanniminen jäsen peritään useammasta luokasta. Samoin

18 dynaamisen sidonnan toteuttaminen on hieman hankalampaa kielessä, jossa moniperiytyminen on sallittu. C++ -kielessä ei noudateta automaattisesti dynaamista sidontaa, vaan kun esimerkiksi laaditaan luokkarakenne: class Kanta public: void kanta_funktio() cout << "Olen Kanta -luokan funktio" << endl; ; class AliKanta: public Kanta public: void kanta_funktio() cout << "Olen AliKanta -luokan funktio" << endl; ; class Alimmainen:public AliKanta public: void kanta_funktio() cout << "Olen Alimmainen -luokan funktio" << endl; ; ja kirjoitetaan funktio koodi void kutsu_funktio(kanta *k) k->kanta_funktio(); Alimmainen alin; kutsu_funktio(&alin);

19 tulostaa Olen Kanta -luokan funktio koska funktiokutsussa olion osoite välittyy parametrina osoittimena Kanta -luokan olioon ja funktiota ei sidota dynaamisesti oikeaan luokkaan. Sama koskee viitetyypin muuttujia, ts. jos funktio on void kutsu_funktio(kanta &k) k.kanta_funktio(); ja ohjelmakoodi Alimmainen alin; kutsu_funktio(alin); tulos on sama. Jos sen sijaan muutettaisiin Kanta-luokan funktio virtuaaliseksi seuraavasti: tulostuisi class Kanta public: virtual void kanta_funktio() cout << "Olen Kanta -luokan funktio" << endl; ; Olen Alimmainen -luokan funktio koska virtuaalisiksi määritellyt metodit sidotaan dynaamisesti. C++:ssa kantaluokan virtuaaliset metodit periytyvät virtuaalisina koko hierarkian läpi, ts. ne ovat virtuaalisia kaikissa aliluokissa, näiden aliluokissa jne., vaikka aliluokissa niitä ei erikseen määriteltäisi virtuaalisiksi.

20 Joskus kantaluokasta halutaan tehdä abstrakti luokka. Tämä onnistuu C++ -kielessä sisällyttämällä luokkaan vähintään yksi puhtaasti virtuaalinen funktio, jolle ei anneta runkoa vaan merkitään se nollaksi. Esimerkiksi yllä Kanta -luokan funktio voitaisiin määritellä class Kanta public: virtual void kanta_funktio() = 0; ; Tällöin luokasta tulee abstrakti, eikä siitä voi luoda oliota. Mikäli luokan aliluokista halutaan konkreettisia, niissä on aina ylikirjoitettava puhtaasti virtuaaliset metodit Java Lopuksi tarkastellaan periytymistä ja dynaamista sidontaa Java-kielessä ja vertaillaan sitä C++-kieleen. Vaikka Javakaan ei ole puhtaasti oliokieli (primitiiviset tietotyypit eivät ole olioita), se on sitä voimakkaammin kuin C++, joka sisältää esimerkiksi luetellut tietotyypit, jotka eivät ole olioita. Samoin C++:n taulukot eivät ole olioita. Javassa kaikki muu kuin primitiiviset tietotyypit perustuu olioihin. Edelleen, Javan kaikki luokat perivät Object -luokan, C++-luokka ei oletusarvoisesti peri mitään. Näin ollen C++ -kielessä on mahdollista kirjoittaa luokka, jolla ei ole lainkaan jäseniä, mikä ei onnistu Javassa. (Ks. [Arn], luku 3) Javassa jokainen luokka perii (extends) täsmälleen yhden luokan (ellei luokan ilmoiteta perivän toista luokkaa, se perii Object -luokan). Näin ollen Javan luokkahierarkia on puumainen. Moniperiytymisen puutetta korvaamaan on Javassa otettu rajapinta (interface). Rajapinta on eräänlainen puhtaasti abstrakti luokka, joka sisältää ainoastaan metodien esittelyt. Jokainen konkreettinen luokka, joka toteuttaa (implements) rajapinnan, on velvollinen toteuttamaan rajapinnan kaikki metodit. Abstrakti luokka voi sen sijaan jättää rajapinnan metodin toteuttamatta. Luokka voi toteuttaa rajoittamattoman määrän rajapintoja. Rajapinnat voivat myös periä toisia rajapintoja.

21 Javassa luokka pitää tarvittaessa erikseen määritellä abstraktiksi ja tällainen luokka voi sisältää abstrakteja metodeja (vaikka luokka voidaan määritellä abstraktiksi siitä huolimatta, että sillä ei ole abstrakteja metodeja). Abstrakti luokka voidaan kirjoittaa esimerkiksi seuraavasti: public abstract class MessagePasser public abstract void send(object o); public void send(int i) send(new Integer(i)); public void send(double d) send(new Double(d)); public abstract Object receive(); public int receiveint return(((integer)this.receive()).intvalue()); public double receivedbl return(((double)this.receive()).doublevalue()); Mikäli halutaan muodostaa konkreettinen luokka, joka perii ylläolevan luokan, on metodit send(object o) ja receive() toteutettava. Tällöin saadaan automaattisesti käyttöön metodin send muut versiot ja metodit receiveint() sekä receivedbl(). Javan periytymisessä ei voida näkyvyyttä säätää kuten C++:ssa. Javan periytyminen vastaa C++:n public-tyyppistä periytymistä. Siis aliluokka perii kaikki public- ja protected -tyyppiset jäsenet ja niiden näkyvyydet säilyvät samana aliluokassa. Private-tyyppiset jäsenet eivät näy aliluokassa. Tästä seuraa myös se, että aliluokka on aina kantaluokan alityyppi, mikä helpottaa ohjelmointia. Javassa voidaan perimisketju katkaista määrittelemällä luokka final-tyyppiseksi. Tällöin luokkaa ei voi enää periä aliluokkiin. Myös luokan metodi voidaan määritellä final-tyyppiseksi, mikä tarkoittaa sitä, että metodia ei voi enää aliluokissa määritellä uudelleen.

22 Javassa kaikki sidonta on dynaamista, ts. ohjelmoija ei voi itse valita sidonnan tyyppiä kuten C++:ssa. Tämä toisaalta tekee ohjelmoinnin helpommaksi ja luotettavammaksi; koska sidonta toimii aina samalla lailla, ei voi tehdä vahingossa koodia, jossa kutsuttaisiin väärän luokan metodia funktiokutsun seurauksena, mikäli vain tuntee oletussidonnan. Näin ollen tulostaa class Kanta public void kanta_funktio() System.out.println("Olen Kanta -luokan funktio"); class AliKanta extends Kanta public void kanta_funktio() System.out.println("Olen AliKanta -luokan funktio"); class Alimmainen extends AliKanta public void kanta_funktio() System.out.println("Olen Alimmainen -luokan funktio"); public class DynBind static void kutsuja(kanta k) k.kanta_funktio(); public static void main(string[] args) Alimmainen alin = new Alimmainen(); kutsuja(alin);

23 Olen Alimmainen -luokan funktio Yhteenvetona voidaan todeta, että vaikka Javan luokkamalli pohjautuukin C++-kielen malliin, sitä on yksinkertaistettu monin tavoin. Moniperiytyminen on poistettu ja korvattu rajapintojen käytöllä. Kaikki luokat perivät yhteisen perusluokan (Object). Edelleen kaikki sidonta on dynaamista. Erityisesti periytymiseen liittyvät näkyvyysmääreet on yksinkertaistettu C++:n vaikeasti hallittavasta järjestelmästä huomattavasti selkeämmäksi ja helppokäyttöisemmäksi mekanismiksi. Myös C++ - kielen sallimasta ystäväjärjestelmästä on luovuttu. Näistä ominaisuuksista ainoastaan moniperiytymisen puuttumista voidaan vakavasti arvostella ohjelmoijan työtä hankaloittavana seikkana. Sekä C++ että Java sallivat sisäkkäisten luokkien määrittelyn, mitä jotkut teoreetikot ovat arvostelleet epäonnistuneena ratkaisuna. Lähteet [Arn] Arnold, Ken Gosling, James. The Java Programming Language, Second Edition, Addison-Wesley [Har] Harsu, Maarit. Ohjelmointikielet, Periaatteet, käsitteet, valintaperusteet, Talentum [Kur] Kurki-Suonio Reino. Ada-kieli ja ohjelmointikielten yleiset perusteet. MODEEMI ry Tampere [Lou] Louden, Kenneth C. Programming Languages, Principles and Practice, PWS-KENT [Seb] Sebesta, Robert W. Concepts of Programming Languages 10th edition, Pearson [Strou] Stroustrup, Bjarne. The C++ Programming Language, 3rd edition, Murray Hill 1997.

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 V Abstraktit tietotyypit ja olioohjelmointi Sisältö I. Abstraktit tietotyypit II. 1. Johdatus abstrakteihin tietotyyppeihin 2. Abstraktit tietotyypit Adassa

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

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

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance) Sisällys JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys Periytyminen (inheritance) Näkyvyys (visibility) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E. Hyvönen: Java Osa

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin 812347A Olio-ohjelmointi, 2015 syksy 2. vsk II Johdanto olio-ohjelmointiin Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden esittely 2 II.1 Abstraktiosta

Lisätiedot

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

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

Olio-ohjelmointi Johdanto olio-ohjelmointiin

Olio-ohjelmointi Johdanto olio-ohjelmointiin Olio-ohjelmointi Johdanto olio-ohjelmointiin Ohjelmistoa kehitettäessä voidaan tunnistaa ainakin kaksi abstraktiota: prosessiabstraktio ja dataabstraktio. Prosessiabstraktio huomattiin jo varhain, koska

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

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

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.

Lisätiedot

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

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

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi. 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

Lisätiedot

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. 11. Rajapinnat. Johdanto. Johdanto Sisällys 11. ajapinnat. bstrakti luokka vai rajapinta? ajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen avulla.

Lisätiedot

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

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia. 4. Periytyminen 4.1. Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1 12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Myöhäinen ja aikainen sidonta. Parametrinvälitys

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

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

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

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

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

812341A Olio-ohjelmointi, I Johdanto

812341A Olio-ohjelmointi, I Johdanto 812341A Olio-ohjelmointi, 2016 I Johdanto Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden kertausta 812341A Olio-ohjelmointi, Johdanto 2 1 Abstraktiosta

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IV Periytyminen ja monimuotoisuus 812347A Olio-ohjelmointi, 2015 syksy 2. vsk IV Periytyminen ja monimuotoisuus Sisältö 1. Periytyminen 2. Johdanto monimuotoisuuteen 3. Ylikuormittaminen 4. Uudelleenmäärittely 5. Muuttujien monimuotoisuus

Lisätiedot

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

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi

Lisätiedot

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

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2 8. Periytyminen 8.1 Sisällys Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2 Mitä on periytyminen? Periytyminen (inheritance) tarkoittaa luokan piirteiden

Lisätiedot

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely

Lisätiedot

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

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton 2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et.

Lisätiedot

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

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä 2016 IX Olioiden välisistä yhteyksistä Sisältö 1. Johdanto 2. Kytkentä 3. Koheesio 4. Näkyvyydestä 2 Johdanto n Ohjelmassa syntyy kytkentöjä olioiden välille Toivottuja ja epätoivottuja n Näkyvyys vaikuttaa

Lisätiedot

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä

Lisätiedot

12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1 12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Parametrinvälitys eräs monimuotoisuuden sovellus.

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

Mitä on periytyminen?

Mitä on periytyminen? 8. Periytyminen 8.1 Sisällys Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Filosofinen ja käytännönläheinen näkökulma periytymiseen. Periytymisen soveltaminen. 8.2 Mitä

Lisätiedot

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

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

Muutamia peruskäsitteitä

Muutamia peruskäsitteitä Muutamia peruskäsitteitä Huom. 1: nämä peruskäsitteet eivät muodosta hyvin määriteltyä keskenään yhteensopivien käsitteiden joukkoa, vaan käsitteet ovat osittain päällekkäisiä ja eri yhteyksissä niillä

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

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

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen

Lisätiedot

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

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Pakkaukset ja määreet Toisiinsa liittyvät luokkatiedostot voidaan koota pakkauksiksi. Luo hierarkiaa ja järjestystä ohjelmistotuotteeseen.

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

Rajapinta (interface)

Rajapinta (interface) 1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä

Lisätiedot

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

Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1 Oliot ja luokat Javaohjelmoinnissa Vesa Laakso 22.9.2012 Sisällysluettelo Sisällysluettelo... 1 Johdanto... 2 1. Luokka... 2 2. Olio... 2 3. Luokan

Lisätiedot

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

Virtuaalifunktiot ja polymorfismi

Virtuaalifunktiot ja polymorfismi Virtuaalifunktiot ja polymorfismi 16 Virtuaalifunktiot ja polymorfismi Polymorfismi on niin tehokas olio-ohjelmoinnin ominaisuus, että tulet varmastikin käyttämään sitä lähes kaikissa C++-ohjelmissasi.

Lisätiedot

Oliot viestivät metodeja kutsuen

Oliot viestivät metodeja kutsuen 6. Metodit 6.1 Sisällys Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit). Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Opintojakso TT00AA11 Ohjelmoinnin jatko (Java) Tavoite Opiskelija ymmärtää olio-ohjelmoinnin problematiikan. Opiskelija osaa määritellä ja käyttää itse

Lisätiedot

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

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 11. Luokka Opetellaan seuraavaksi, miten omia luokkia kirjoitetaan. Aikaisemmin olikin jo esillä, että luokka on tietorakenne, joka sisältää sekä tiedot (attribuutit) että niitä käsittelevät aliohjelmat

Lisätiedot

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin Olio-ohjelmointi: Luokkien toteuttaminen Jukka Juslin Luokkien kirjoittaminen Tähän mennessä on käytetty valmiiksi määritettyjä luokkia. Nyt opimme kirjoittamaan omia luokkia olioiden kuvaamiseksi Seuraavaksi

Lisätiedot

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi Solidity älysopimus ohjelmointi Sopimus suuntautunut ohjelmointi Merkle puu Kertausta eiliseltä Solidity on korkean tason älysopimus ohjelmointikieli Muistuttaa olio-ohjelmointia Javalla Sopimuskoodi on

Lisätiedot

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät Tenttikysymykset 1. Selitä mitä asioita kuuluu tietojärjestelmän käsitteeseen. 2. Selitä kapseloinnin ja tiedon suojauksen periaatteet oliolähestymistavassa ja mitä hyötyä näistä periaatteista on. 3. Selitä

Lisätiedot

Pakkauksen kokoaminen

Pakkauksen kokoaminen 13. Pakkaukset 13.1 Sisällys Pakkauksen kokoaminen package-määrettä käyttäen. Pakkaukset ja hakemistorakenne. Pakkauksen luokkien käyttö muissa pakkauksissa importlauseen avulla. Pakkaukset ja näkyvyys.

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

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

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3 16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

C# olio-ohjelmointi perusopas

C# olio-ohjelmointi perusopas Paavo Räisänen C# olio-ohjelmointi perusopas www.ohjelmoimaan.net Tätä opasta saa vapaasti kopioida, tulostaa ja levittää ei kaupallisissa tarkoituksissa. Kuitenkaan omille nettisivuille opasta ei saa

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä 812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus

Lisätiedot

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

Lisätiedot

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2010 Välikoe / 26.3 Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään

Lisätiedot

12 Mallit (Templates)

12 Mallit (Templates) 12 Mallit (Templates) Malli on määrittely, jota käyttämällä voidaan luoda samankaltaisten aliohjelmien ja luokkien perheitä. Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista

Lisätiedot

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

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä 582104 Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä 1 Luokkamallin lisäpiirteitä Erilaiset yhteystyypit kooste kompositio Muita luokkien välisiä suhteita riippuvuudet periytyminen eli luokkahierarkia

Lisätiedot

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

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus Sisällys 19. Olio-ohjelmointia Javalla Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

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

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3 15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet

Lisätiedot

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

TIE-20200 Ohjelmistojen suunnittelu. Luento 8..9: moniperintä TIE-20200 Ohjelmistojen suunnittelu Luento 8..9: moniperintä 1 Ajankohtaista Harjoitustyön suunnittelusessiot pidetty, työt jatkuvat, välivaiheen esittely seuraavana Viimeinen viikkoharjoituskerta, palataan

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

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

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) 1(37) PERIYTYMINEN (inheritance) YLILUOKKA (superclass) ALILUOKKA (subclass) A) on käytännöllinen ohjelmointitekniikka = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) B) on käsitteiden

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

19. Olio-ohjelmointia Javalla 19.1

19. Olio-ohjelmointia Javalla 19.1 19. Olio-ohjelmointia Javalla 19.1 Sisällys Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit

Lisätiedot

4. Olio-ohjelmoinista lyhyesti 4.1

4. Olio-ohjelmoinista lyhyesti 4.1 4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

Sisällys. 15. Lohkot. Lohkot. Lohkot

Sisällys. 15. Lohkot. Lohkot. Lohkot Sisällys 15. Lohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.1 15.2 Lohkot Aaltosulkeet

Lisätiedot

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

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: 1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef

Lisätiedot

16. Javan omat luokat 16.1

16. Javan omat luokat 16.1 16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat

Lisätiedot

7. Näytölle tulostaminen 7.1

7. Näytölle tulostaminen 7.1 7. Näytölle tulostaminen 7.1 Sisällys System.out.println- ja System.out.print-operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden muotoilua. 7.2 Tulostusoperaatiot System.out.println-operaatio

Lisätiedot

Periytyminen. Luokat ja olio-ohjelmointi

Periytyminen. Luokat ja olio-ohjelmointi Periytyminen 15 Periytyminen Tässä luvussa käsittelemme aihetta, joka on olio-ohjelmoinnin kaikkein tärkein osa - periytyvyys. Periytyvyyden avulla voimme luoda uusia luokkia uudelleenkäyttämällä ja laajentamalla

Lisätiedot

812336A C++ -kielen perusteet, 21.8.2010

812336A C++ -kielen perusteet, 21.8.2010 812336A C++ -kielen perusteet, 21.8.2010 1. Vastaa lyhyesti seuraaviin kysymyksiin (1p kaikista): a) Mitä tarkoittaa funktion ylikuormittaminen (overloading)? b) Mitä tarkoittaa jäsenfunktion ylimääritys

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

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

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1 Ohjelmistojen mallintaminen Luokkakaaviot 5.12.2008 Harri Laine 1 Olioiden palvelut Palvelun kuvauksessa annettavat tiedot näkyvyys (kuten attribuuttien kohdalla) nimi (ainoa välttämätön osa) parametrit

Lisätiedot

KOHDELUOKAN MÄÄRITTELY

KOHDELUOKAN MÄÄRITTELY KOHDELUOKAN MÄÄRITTELY Kohdeluokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Taulukon alkiona

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

Taulukot. Jukka Harju, Jukka Juslin 2006 1 Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti

Lisätiedot

Pakkauksen kokoaminen

Pakkauksen kokoaminen 13. Pakkaukset 13.1 Sisällys Pakkauksen kokoaminen (package). Pakkaukset ja hakemistorakenne. Pakkauksen luokkien käyttö muissa pakkauksissa (import). Pakkaukset ja näkyvyys. 13.2 Pakkauksen kokoaminen

Lisätiedot

Luokat. Luokat ja olio-ohjelmointi

Luokat. Luokat ja olio-ohjelmointi Luokat 12 Luokat Tässä luvussa laajennamme edellisessä luvussa käsittelemäämme struktuurityyppiä ja siirrymme yhteen C++-ohjelmoijan kaikkein tärkeimmistä välineistä: luokkiin. Käsittelemme myöskin joitakin

Lisätiedot

4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA: REFAKTOROINTI 2 (9) SEPA: REFAKTOROINTI 3 (9) VERSIOHISTORIA Version Date Author Description 0.1 2.12.2005 Erik Hakala Ensimmäinen

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli Dart Ryhmä 38 Ville Tahvanainen Juha Häkli 1.LYHYESTI Dart on luokkapohjainen, yksiperintäinen, puhdas olio-ohjelmointikieli. Dart on dynaamisesti tyypitetty. Sovellukset on organisoitu modulaarisiksi

Lisätiedot

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen ADA Ohjelmointikieli Ryhmä 5 Henna Olli, Päivi Hietanen 1 JOHDANTO Ada on käännettävä ohjelmointikieli, joka kehitettiin vähentämään sulautettujen ja reaaliaikaisten järjestelmien käyttökustannuksia. Kieli

Lisätiedot