TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

Koko: px
Aloita esitys sivulta:

Download "TIE-20200 Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua"

Transkriptio

1 TIE Ohjelmistojen suunnittelu Kopiointia ja sijoittelua 1

2 Elinkaari Olion elinkaari: olion tapahtumat luomisesta tuhoutumiseen Ei-olio-ohjelmoinnissa ei yleensä tärkeä(?) Olio-ohjelmoinnissa merkitys korostuu Miksi? Eroja eri oliokielissä 2

3 Olion syntymä ja kuolema Olion syntyessä: Jäsenmuuttujien luominen Muistinvaraus Muut tarvittavat oliot Rekisteröitymiset Resurssit... Osa automatisoitu, osa ohjelmoijan vastuulla Olion tuhoutuessa yleensä vastakkaiset toimenpiteet Automaattisuus jälleen kieliriippuvainen 3

4 Elinkaaren määräytyminen Riippuu kielestä: Vain muistinvaraus Muistinvaraus & roskienkeruu Alustustoimenpiteet automaattisia Siivoustoimenpiteet automaattisia, ajankohta ei määrätty Siivous automaattista, tuhoutumishetki määrätty 4

5 Rakentajien ongelmia C++ Jos käyttäjä ei määrittele yhtään rakentajaa, luodaan automaattisesti oletusrakentaja Generoitu rakentaja ei alusta muuttujia mihinkään arvoon Älä siis luota generoituun rakentajaan, vaan määrittele aina rakentaja itse. Rakentaja voi toimia tyyppimuunnosoperaattorina // Paivays( int p = 1, int k = 1, int vuosi = 2013 ); // funktio laskee montako päivää on tuomiopäivään int paiviatuomiopaivaan( Paivays pvm ); int jaljella = paiviatuomiopaivaan( 4 ); // Mitäs tuossa yllä tapahtuikaan, virhe? 5

6 Tyyppimuunnokset Älä käytä c-tyylin tyyppimuunnoksia. Jos haluat tehdä tyyppimuunnoksen, käytä C++:n tyyppimuunnoksia static_cast< uusityyppi >( muunnettava ); Esimerkki: char mychar = 'c'; int charval = static_cast< int >( mychar ); // charval = 99 --charval; mychar = static_cast< char >( charval ); // mychar = b Jos implisiittiset tyyppimuunnokset haluaa kieltää, pitää käyttää explicit avainsanaa rakentajan yhteydessä: class Paivays public: explicit Paivays( unsigned int paiva=1, unsigned int kk=1, unsigned int vuosi=2013 ); 6

7 Olioiden purkaminen C# ja Java Roskienkeruu hoitaa purkamisen parhaaksi katsomaansa aikaan Olioiden "purkuvalmiutta" tarkastellaan olion saavutettavuuden avulla Javassa finalize, C# finalize/purkaja (C++:sta tuttu syntaksi vain hämäyksenä) C#:n purkaja, (unmanaged resources) Idisposable-olioiden hävittäminen (Dispose) Roskienkeruun pakkokäynnistys (yleensä turhaa/huono ajatus) onnistuu Collect-funktiolla Roskienkeruuesimerkki (vs. C++) 7

8 Kaksivaiheinen purkaminen Purkajan kutsuhetki epävarma Jos halutaan poistaa olio ohjelmasta, voidaan käyttää kaksivaiheista purkamista Kontrolloitu resurssien vapauttaminen erillisellä funktiokutsulla, kun oliosta halutaan eroon Roskienkeruun käyttämä purkaja/metodi, jonka ajamishetkellä ei merkitystä (hoitaa muistin siivouksen) 8

9 Java/C# vs. C++ Javassa roskienkeruun hoitaa JVM (Java Virtual Machine) C# (ja Windows ympäristö), roskienkeruusta vastaa CLR (Common Language Runtime) Molemmissa sama idea, rauta/käyttöliittymätason päällä oma hiekkalaatikko/ajoympäristö, jossa sovellukset suoritetaan C++ sovellus käännetään kullekin ympäristölle (natiivikoodia) Virtuaalikone vaihtuu kun vaihdetaan alustasta toiseen, sama ("käännetty") koodi toimii kaikkialla 9

10 Kopiorakentajat Kopiorakentaja: Luo uuden olion, joka on kopio jo olemassa olevasta oliosta Toimintona samanlainen kuin normaali olion luominen Kopiorakentaja on kuten normaali rakentaja, mutta ottaa alustuksessa käyttämänsä tiedot toiselta samanlaiselta oliolta Joissain tilanteissa pakollinen, joissain hyödyllinen C++: kopioita tarvitaan ja niitä syntyy automaattisesti mm. seuraavissa tilanteissa: Kun funktio palauttaa arvon(*) STL:n säiliöt Funktion parametrit ja arvonvälitys Lisäksi olioiden kopiointi on usein hyödyllistä myös ohjelmoijalle. (*)Return value optimization (RVO) kääntäjä voi käyttää paluuarvon optimointia ja poistaa tarpeettomia kopiointeja 10

11 Automaattisia kopioita string funktiopalauttaa() string paluu( "abc" ); // Tilapäinen kopio palautettavasta merkkijonosta luodaan, sillä funktion sisäisten muuttujien // näkyvyysalue päättyy funktion lopussa ja tällöin kaikki tilapäiset muuttujat poistetaan. return rval; void funktionparametri( string parametri ) // alkuperäisen sijaan funktion sisällä käsitellään kopiota // (call by value) parametri = "abc"; string alkuperainen( "original data" ); string kopio( alkuperainen ); // luodaan kopio ekplisiittisellä kopion rakentamisella funktiopalauttaa( alkuperainen ); vector< string > strings; strings.push_back( alkuperainen ); // kopio luodaan ja tallennetaan vectoriin string.push_back( kopio ); // Kun vektorin koko muuttuu, poistetaan muistissa ollut kopio ja luodaan kopion // kopio uuteen paikkaan kopion kopio lisätään vektorin perään. 11

12 Kopiointiin liittyviä kysymyksiä Milloin kopiointia tarvitaan? Mikä on olion kopio? Perusmuuttujat, kopioidaan alkuperäisen muuttujan muistin sisältö uudelle oliolle Olioiden kanssa on mietittävä mitä oikeastaan halutaan kopioida? Kaikkien jäsenmuuttujien sisältö? Kaikkien viitteiden ja osoittimien sisältö? Kaikki rekisteröinnit ja suhteet, joita oliolla on? 12

13 Mitä eri kopiointitapoja C++:ssa on? 13

14 Viitekopiointi Kopio luodaan luomalla uusi viite, joka osoittaa samaan olioon (Java, Smalltalk, C#) class CarOwner public: CarOwner( string name, Car* car ); CarOwner( string name, Car* car ); void changecar( Car* newcar ); private: string name_; Car* mycar_; ; class Car ; Car lada( lada ); CarOwner tero( tero, &lada ); CarOwner& ref1 = tero; CarOwner& ref2 = ref1; tero, ref1 ja ref2 viittaavat samaan olioon. Tero:CarOwner ref 1 ref 1 Tero changecar() drive() refuel() Tero:CarOwner Tero changecar() drive() refuel() ref 2 external data (Lada:Car) external data (Lada:Car) 14

15 Matala kopiointi Matala kopio luodaan kopioimalla kaikkien jäsenmuuttujien arvot. Kopiorakentaja on helppo luoda automaattisesti (kääntäjän toimesta) Ongelmat: luokan ulkopuoliset tiedot, pitääkö luoda kopio myös osoittimien (+viitteiden) päässä olevasta tiedosta, itse osoitin vai kenties jättää osoitin nolla-arvoon? Ennen: Jälkeen: Tero:CarOwner Tero f1() f2() f3() Tero:CarOwner Tero f1() f2() f3() Tero2:CarOwner Tero f1() f2() f3() external data (Lada:Car) external data (Lada:Car) Terosta tehdään klooni, tämän jälkeen Teron kopio kuvittelee voivansa ajella Teron autolla 15

16 Syvä kopiointi on hyvä kopiointi? Tehdään kopio myös olion tilaan kuuluvasta ulkopuolisesta datasta oikea kopiointitapa Mitkä osat olion ulkopuolisista asioista kuuluvat oliolle itselleen ja mitkä ovat rekisteröintejä tai jaettuja resursseja? Mitä olio omistaa ja mitä se käyttää? Kääntäjä ei voi päätellä näitä automaattisesti koodarin on määriteltävä nämä itse Class Circle private: int radius_; Color bordercolor_; Canvas* canvas_; Database* database_; Coordinate* location_; ; 16

17 Syväkopiointiesimerkki Ennen: Jälkeen: Tero:CarOwner Tero f1() f2() f3() Tero:CarOwner Tero f1() f2() f3() Tero2:CarOwner Tero f1() f2() f3() external data (Lada:Car) external data (Lada:Car) external data (Lada2:Car) Nyt Terolla ja kloonilla on molemmilla oma autonsa! 17

18 Periytyminen ja kopiorakentaja Kopiorakentaja on rakentaja (OMG?!?!½!) Aliluokan kopiorakentajan on kutsuttava kantaluokan kopiorakentajaa! Kantaluokan kopiorakentaja huolehtii kantaluokan kopiointiosuudesta, aliluokka omastaan Parametrina saatu olio annetaan kantaluokan kopiorakentajan parametriksi Miksi toimii/onnistuu? 18

19 Kopiorakentajat class Ihminen public: Ihminen( string n ); Ihminen( const Ihminen& i ); virtual ~Ihminen(); ; class Rallikuski: public Ihminen public: Rallikuski( string n, string a ); Rallikuski( const Rallikuski& r ); ; 19

20 toteutukset Ihminen::Ihminen( string n ): nimi_( n ) cout << "Ihminen " << nimi_ << " syntyi." << endl; Ihminen::Ihminen( const Ihminen& i ): nimi_( "klooni_" + i.nimi_ ) Ihminen::~Ihminen() cout << "Ihminen kuoleentui: " << nimi_ << endl; Rallikuski::Rallikuski( string n, string a ): Ihminen( n ), auto_( a ) Rallikuski::Rallikuski( const Rallikuski& r ): Ihminen( r ), auto_( r.auto_ ) cout << "rallikuskin kloonaus." << endl; 20

21 Mitäs täällä tapahtuukaan? Rallikuski-esimerkki laajennettuna (Rallikuski, Formulakuski ja SupKuski perittynä Ihmisestä) void haastattele( Ihminen kohde ) kohde.haastattelu(); Ihminen annaaakkosissaeka( Ihminen& vertailtava1, Ihminen& vertailtava2 ) return vertailtava1.nimi() >vertailtava2.nimi()? vertailtava1: vertailtava2; vector< Ihminen > ihmiskasa; Rallikuski mikko( "Mikko", "Ford" ); ihmiskasa.push_back( mikko ); ihmiskasa.push_back( SupKuski( "Yontza" ) ); for( Ihminen ihminen: ihmiskasa ) ihminen.haastattelu(); 21

22 Viipaloituminen C++:ssa oliota luotaessa on tiedettävä olion tyyppi (koodari kertoo, mitä haluaa luoda) Entäs jos halutaan kopioida kantaluokkaosoittimen päässä olevat oliot? Aliluokan olio on myös kantaluokan olio Mikä tahansa jälkeläinen kelpaa hyvin myös kantaluokan kopiorakentajalle Luodaan uusi kantaluokan olio kopiona aliluokan oliosta == viipaloituminen (slicing) 22

23 viipaloituminen Cat misse( "Misse" ); Animal elukka( misse ); Misse kelpaa hienosti kopiorakentajan parametriksi, mutta kopiointi koskee vain kantaluokan osuutta Aliluokan osuuteen ei kosketa ja se jää kopioitumatta => viipaloituminen Animal Kantaluokan kopiorakentaja Animal Cat Viipaloituminen! Going to be sliced 23

24 Viipaloitumispaikkoja Viipaloituminen voi tapahtua vahingossa(kin) useissa eri tilanteissa KirjastonKirja etsimyohassaoleva( const vector< KirjastonKirja* >& kirjat ); void kirjani( Kirja munkirja ) cout << Tää on mun kirja!" << endl; munkirja.tulosta( cout ); Paluuarvot ja funktion parametrit Kirjat klassikko("donkey Hot", "Mikuel de Servettes" ); klassikko = etsimyohassaoleva( kirjat ); KirjastonKirja lainattu( "Volter Kilpi", "Alastalon salissa", Date(1,1,2011 ) ); kirjani( lainattu ); vector< Ihminen > ihmiskasa; ihmiskasa.push_back( mikko ); ihmiskasa.push_back( SupKuski( "Yontza" ) ); Stl:n säiliöt Kun käsitellään olioita, joilla voi olla aliluokkia/perintähierarkioita, kannattaa vektoriin tuupata vain osoittimia 24

25 Viipaloituminen ja muut oliokielet Kopioimisviipaloituminen lähes yksinomaan C++:n ongelma Useimmissa muissa kielissä oliot aina viitteiden päässä olioiden elinkaari aina dynaaminen olio kopioidaan käskemällä alkuperäistä oliota kopioimaan itsensä Olio itse tietää oikean tyyppinsä, joten kopiointi onnistuu Arvoparametrit ja paluuarvot harvinaisia muissa kielissä (paitsi perustietotyypit) Muissa kielissä tietorakenteissa vain viitteitä olioihin 25

26 Kloonien tekeminen Miten kopioida kantaluokan päässä oleva olio, jonka tyyppi voi olla mitä vaan? Käydään läpi kaikki vaihtoehdot tyyppitarkastuksilla, kutsutaan oikeaa kopiorakentajaa kun tyyppi selvillä, ei ehkä kätevin vaihtoehto Entä jos/kun hierarkiaa laajennetaan/muokataan? 26

27 Kloonien tekeminen, kloonit Viipaloituminen kierrettävissä C++:ssa matkimalla muita kieliä Luokkiin jäsenfunktio kloonaa: Luo new:llä kopion oliosta(kopiorakentajaa käyttäen) Palauttaa osoittimen uuteen olioon Virtuaalifunktio, määritellään uudelleen jokaiseen aliluokkaan Kutsuttaessa luo aina oikeantyyppisen kopion olioista Ongelmia: Kopion tuhoamisvastuu siirtyy kutsujalle (delete) tai fiksujen osoittimien käyttö Joka luokkaan muistettava kirjoittaa oma kloonausfunktio, mitä käy jos unohdetaan? Muuta: (Paluuarvo-osoittimen tyyppi vaihtuu aliluokassa kovariantit paluutyypit) 27

28 kloonausfunktiot class Organism public: virtual ~Organism(); virtual Organism* clone() const = 0; ; class Animal: public Organism public: Animal( std::string id ); Animal( const Animal& a ); virtual ~Animal(); Location getlocation() const; std::string getid() const; virtual Animal* clone() const = 0; private: Location loc_; std::string id_; ; Kopiorakentaja voidaan pistää myös privatenäkyvyysalueelle, jolloin kopioita voi tehdä vain kloonaamalla, toimisiko? Miksei? Miksi esittely toistettu joka tasolla? class Bird: public Animal public: Bird( std::string id ); Bird( const Bird& ); virtual ~Bird(); virtual void sing() const; virtual void move( Location newl ) = 0; virtual void printvisited() const; virtual Bird* clone() const = 0; private: std::vector< Location* > visited_; ; class Crow: public Bird public: Crow( std::string id ); Crow( const Crow& c ); virtual ~Crow(); virtual void sing() const; virtual void move( Location newl ); virtual Crow* clone() const; ; class CarrionCrow: public Crow public: CarrionCrow( std::string id ); CarrionCrow( const CarrionCrow& cc ); virtual ~CarrionCrow(); virtual void sing() const; virtual CarrionCrow* clone() const; ; 28

29 Kloonauksen toteutus // toteutus vain tavallisille virtuaalifunktiolle (ei pure virtual) Crow* Crow::clone() const return new Crow( *this ); CarrionCrow* CarrionCrow::clone() const return new CarrionCrow( *this ); 29

30 #include "animals.hh" #include <iostream> using namespace std; void cloneall( vector<animal*>& zoo ); void moveanimals( vector<animal*>& animals ); käyttö int main() vector<animal*> birds; CarrionCrow* cr = new CarrionCrow( "Kalle" ); CarrionCrow* cr2 = cr->clone(); // kloonaamalla kopiointi CarrionCrow* cr3 = new CarrionCrow( *cr2 ); // kopiorakentajan kutsu cr->move( Location( 5, 6 ) ); cr->move( Location( 10, 2 ) ); birds.push_back( cr ); birds.push_back( cr2 ); birds.push_back( cr3 ); cloneall( birds ); moveanimals( birds ); cr->printvisited(); while(!birds.empty() ) delete birds.at( birds.size()-1 ); birds.pop_back(); 30

31 Käyttö, funktioiden toteutukset void cloneall( vector<animal*>& zoo ) unsigned originalsize = zoo.size(); for( unsigned i(0); i < originalsize; ++i ) cout << "hep" << endl; zoo.push_back( zoo.at(i)->clone() ); void moveanimals( vector<animal*>& animals ) for( unsigned i(0); i < animals.size(); ++i ) animals.at(i)->move( Location( animals.at(i)->getlocation().x+i, animals.at(i)->getlocation().y+i ) ); 31

32 Java ja kloonailu Javassa kloonattavissa olevat oliot tukevat clone() funktiota Tehdään kertomalla, että tietotyyppi toteuttaa Cloneable rajapinnan (erikoisrajapinta) Jos toteutusta ei määritellä, tekee vakiona matalakopioinnin (täälläkin koodari joutuu erikseen määrittelemään, jos halutaan syvä kopio) Javassakaan kopiointi/kloonaus ei ole välttämättä ongelmaton public class Viesti implements Cloneable private String sisalto; private Paivays pvm; public Viesti( String animi, Paivays apvm ) this.nimi = animi; this.pvm = apvm; public Object clone() throws CloneNotSupportedException Viesti clone = (Viesti)super.clone(); // kopioidaan myös viitteen päässä oleva Paivays-olio // (myös päiväyksen on oltava Cloneable) clone.pvm = (Paivays)pvm.clone(); return clone; 32

33 Periytyminen ja sijoitusoperaattori Sijoituksessa sama vastuujako kuin kopioinnissa: Aliluokan sijoitusoperaattori: kutsuu kantaluokan sijoitusta, sijoittaa aliluokkaosan Kantaluokan sijoitusoperaattori: sijoittaa kantaluokkaosan Aliluokan sijoitusoperaattorissa muistettava kutsua kantaluokan sijoitusoperaattoria! Kääntäjä ei varoita, jos kutsu unohtuu! (ja kantaluokan osa jää sijoittamatta) 33

34 Sijoitusoperaattorit class Organism public: virtual ~Organism(); virtual Organism* clone() const = 0; ; class Animal: public Organism public: Animal( std::string id ); Animal( const Animal& a ); Animal& operator =( const Animal& ); virtual ~Animal(); virtual void move( Location newl ) = 0; virtual std::string getid() const; Location getlocation() const; private: Location loc_; std::string id_; ; class Bird: public Animal public: Bird( std::string id ); Bird( const Bird& ); Bird& operator =( const Bird& ); virtual ~Bird(); virtual void sing() const; virtual void move( Location newl ) = 0; virtual void printvisited() const; private: std::vector< Location* > visited_; ; class Crow: public Bird public: Crow( std::string id ); Crow( const Crow& c ); Crow& operator =( const Crow& ); virtual ~Crow(); virtual void sing() const; virtual void move( Location newl ); ; class CarrionCrow: public Crow public: CarrionCrow( std::string id ); CarrionCrow( const CarrionCrow& cc ); CarrionCrow& operator =( const CarrionCrow& ); virtual ~CarrionCrow(); virtual void sing() const; ; 34

35 Toteutukset (Animal & Bird) Animal& Animal::operator =( const Animal& a ) if( this!= &a ) // kantaluokkakutsu varmuuden vuoksi, jos joskus laajennetaan Organism::operator =( a ); id_ = a.id_; loc_ = a.loc_; return *this; Bird& Bird::operator =( const Bird& b ) if( this!= &b ) Animal::operator =( b ); // tuhotaan vanhat while(!visited_.empty() ) delete visited_.at( visited_.size()-1 ); visited_.pop_back(); // kopioidaan kaikki sijoituskohteesta for( unsigned i(0); i < b.visited_.size(); ++i ) Location* loc = b.visited.at( i ); Location* newloc = new Location( *loc ); visited_.push_back( newloc ); return *this; 35

36 Toteutukset (Crow, CarrionCrow) Crow& Crow::operator =( const Crow& c ) if( this!= &c ) Bird::operator =( c ); return *this; CarrionCrow& CarrionCrow::operator =( const CarrionCrow& c ) if( this!= &c ) Crow::operator =( c ); return *this; 36

37 Viipaloituminen ja sijoitus Viipaloituminen vaarana myös sijoituksessa Aliluokan olio on kantaluokan olio sen voi sijoittaa kantaluokan olioon Kantaluokkaviitteiden ja -osoittimien kautta mahdollista myös aliluokkaolion sijoittaminen toisen aliluokan olioon! Sijoituksen viipaloituminen vaarana myös muissa oliokielissä (mutta niissä ei yleensä kieleen sisäänrakennettua oliosijoitusta) 37

38 class NinjaTurtle: public Animal public: NinjaTurtle(std::string id,std::string secretpower); NinjaTurtle( const NinjaTurtle& ); NinjaTurtle& operator =( const NinjaTurtle& ); void usepower() const; virtual std::string getid() const; virtual void move( Location newl ); NinjaTurtle* clone() const; private: std::string secretpower_; ; void assign( Animal& towhere, const Animal& from ) cout << "Before the assignment: " << endl; towhere.getinfo(); towhere = from; cout << "After the assignment: " << endl; towhere.getinfo(); int main() CarrionCrow cr( "Kalle" ); CarrionCrow* cr2 = cr->clone(); // kloonaamalla kopiointi NinjaTurtle raphael( "Raphael", "eat pizza" ); NinjaTurtle donatello( "Donatello", "consume pizza" ); assign( raphael, donatello ); assign( cr, *cr2 ); assign( donatello, cr ); Animal& donatelloref = donatello; donatelloref = cr; cr->printvisited(); delete cr2; // muistetaan poistaa dynaamisen kopioinnin luomat oliot return EXIT_SUCCESS; 38

39 Esimerkki sijoituksesta (elaintason viitteet) Korpista korppiin Korppi->ninjakilpikonna Elain Elain Elain Korppi viipaloituminen Korppi viipaloituminenninjakilpikonna loc1 loc2 loc3 loc4 Salainen kyky 39

40 Sijoitusviipaloitumisen estäminen Sijoitusoperaattori ei voi olla virtuaalinen: parametri ei ole sama aliluokassa! Muutamia(enemmän tai vähemmän) toimivia ratkaisuja: Estetään sijoitus, ei tuu viipaloitumisia Kaikki kantaluokat abstrakteja ei kantaluokkaolioita (sijoituksen voi silti tehdä, jos perityissä luokissa on määritelty sijoitusoperaattorit eikä niissä kutsuta kantaluokan sijoituksia) Sijoitettavan tyypin tarkastaminen ajoaikana typeid-operaattorilla 40

41 1 #include <typeinfo> 2 Korppi& Korppi::operator =(Korppi const& m) 3 4 if(typeid(*this)!= typeid(korppi) typeid(m)!= typeid(korppi)) 5 6 /* Virhetoiminta, esim. Poikkeus */ 7 8 // Tai assert(typeid(*this)== typeid(korppi) && typeid(m) == 9 // typeid(korppi)); 10 if(this!= &m) // normaali sijoitus 12 41

42 Kloonaaminen ja kloonattavuuden tarkistus Miksi kloonaus toimii, mutta virtuaalinen sijoitusoperaattori ei? Paluuarvo-osoittimen tyyppi vaihtuu aliluokassa kovariantit paluutyypit Sama ei sallittua funktion parametreille 42

43 Yhteenvetoa Kopiointi ja sijoittaminen muuttuvat haasteellisemmiksi perinnän astuessa mukaan kuvioihin Viipaloituminen (kopio, sijoitus) Dynaaminen kloonaaminen toimii, jos olion tyyppistä ei ole tietoa 43

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua TIE-20200 Ohjelmistojen suunnittelu Kopiointia ja sijoittelua 1 Tänään tarjolla Tehdasjuttujen esimerkki (vh4- esimerkkivastaus) Harkkatöiden valmiit koodit vol 2 Kopiointijatkoja 2 Kopiointiin liittyviä

Lisätiedot

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu TIE-20200 Ohjelmistojen suunnittelu Luento 7: kopiot, kloonaus, olioiden rakennuttaminen 1 Ajankohtaista Suunnittelusessioiden ajanvaraukset tyrkylle huomenna Viikkoharkkakertoja jäljellä vielä 3 kpl Viikkoharjoituksissa

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

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

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

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

C++11 lambdat: [](){} Matti Rintala C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n

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

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

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

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

Rajapinnat ja olioiden välittäminen

Rajapinnat ja olioiden välittäminen Rajapinnat ja olioiden välittäminen Moduulit/oliot kutsuvat toisiaan kapseloitujen rajapintojen läpi Kutsuissa välitetään usein olioita paikasta toiseen Jos olion omistus (= tuhoamisvastuu) säilyy koko

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

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

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

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

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

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi 1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012 2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille,

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

13 Operaattoreiden ylimäärittelyjä

13 Operaattoreiden ylimäärittelyjä 248 13 C++-kielessä voidaan operaattoreita ylimäärittää. Ylimääriteltävää operaattoria voidaan pitää ikäänkuin metodina, joka esitellään luokan esittelyssä ja määritellään luokan ulkopuolella kuten metoditkin.

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

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

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

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

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.

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

7. Oliot ja viitteet 7.1

7. Oliot ja viitteet 7.1 7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin

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

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

Ohjelman virheet ja poikkeusten käsittely

Ohjelman virheet ja poikkeusten käsittely Ohjelman virheet ja poikkeusten käsittely 17 Ohjelman virheet ja poikkeusten käsittely Poikkeukset ovat tapa ilmoittaa virheistä ja odottamattomista tilanteista C++-ohjelmassasi. Poikkeusten käyttö virheiden

Lisätiedot

TIE-20200 Ohjelmistojen suunnittelu

TIE-20200 Ohjelmistojen suunnittelu TIE-20200 Ohjelmistojen suunnittelu Luento 1: Virtuaalifunktiot, Template method 1 Yleistä asiaa Muistakaa harkkatyöilmoittautuminen 23 ryhmää (mm. lihansyöjäkirahvi), vajaita ryhmiäkin on 44 henkeä vielä

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

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

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

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

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

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl; Demo 6 vastauksia 1. tehtävä #ifndef #define D6T1 H D6T1 H #include using std::ostream; using std::cout; using std::endl; #include using std::string; 10 template class

Lisätiedot

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout: C++ rautaisannos Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout: # include #include main ( ) main (

Lisätiedot

Metodien tekeminen Javalla

Metodien tekeminen Javalla 1 Metodien tekeminen Javalla Mikä metodi on? Metodin syntaksi Metodi ja sen kutsuminen Parametreista Merkkijonot ja metodi Taulukot ja metodi 1 Mikä metodi on? Metodilla toteutetaan luokkaan toiminnallisuutta.

Lisätiedot

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

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi. 17. Kooste 17.1 Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa A on B:n osa tai A kuuluu B:hen. Koostesuhteessa olevat luokat eivät yleensä ole periytymissuhteessa. Kooste

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

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

Luento 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

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

Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

Operaattoreiden uudelleenmäärittely

Operaattoreiden uudelleenmäärittely Operaattoreiden uudelleenmäärittely 14 Operaattoreiden uudelleenmäärittely Tässä luvussa käsittelemme, kuinka voit lisätä toiminnallisuutta luokkiisi, jotta ne toimivat enemmän C++:n perustietotyyppien

Lisätiedot

TIE-20200 Ohjelmistojen suunnittelu

TIE-20200 Ohjelmistojen suunnittelu TIE-20200 Ohjelmistojen suunnittelu Luento 1: Virtuaalifunktiot, Template method 1 Seuraavaksi tarjolla: Otekn-asiaa vähän pintaa syvemmältä Virtuaalifunktiot ja erikoistaminen, olioiden kopiointi ja elinaika

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

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

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

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

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

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

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

14. oppitunti. Operaattorin ylikuormitus. Osa. Operaattorin ylikuormittaminen

14. oppitunti. Operaattorin ylikuormitus. Osa. Operaattorin ylikuormittaminen Osa IV 14. oppitunti Operaattorin ylikuormitus Edellisessä luvussa opit ylikuormittamaan metodeita ja luomaan kopiomuodostimen, joka tekee syvän kopion. Tässä luvussa käsitellään seuraavia aiheita: Kuinka

Lisätiedot

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

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Kompositio Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä kompositio on? Tili - : String - : double 1 1 Kayttoraja

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

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

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

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

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö. Geneeriset luokat C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet Geneerinen luokka tarkoittaa parametroitua luokkamallia, jonka avulla voidaan muodostaa useita,

Lisätiedot

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite 2015 syksy 2. vsk VII Suunnittelumallit Adapter ja Composite Sisältö 1. Johdanto rakennemalleihin 2. Adapter (Sovitin) 3. Composite (Rekursiokooste) Suunnittelumallit Adapter ja Composite 2 VII.1 Johdanto

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

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

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

OHJ-1450 Olio-ohjelmoinnin jatkokurssi lisämateriaalia

OHJ-1450 Olio-ohjelmoinnin jatkokurssi lisämateriaalia 1 OHJ-1450 Olio-ohjelmoinnin jatkokurssi lisämateriaalia Matti Rintala 4 joulukuuta 2007 Tiivistelmä Tämä dokumentti sisältää kurssin OHJ-1450 Olio-ohjelmoinnin jatkokurssi materiaalia, jota ei löydy kurssikirjan

Lisätiedot

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

TIE-20200 Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely Lyhyt UML-opas UML -pikaesittely UML, Unified Modeling Language Standardoitu, yleiskäyttöinen mallinnuskieli, jota ylläpitää/hallitsee (Object Management Group) OMG Historiaa: 90-luvulla oli paljon kilpailevia

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

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

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

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu: TL5302 Olio-ohjelmointi Koe 19.4.2005 Malliratkaisuja Tehtävä 1 Tässä sekä a)- että b)-kohdan toimiva ratkaisu: #include using namespace std; int main() int taul[5]=1,2,3,4,5; int *p,&r=taul[0];

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

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

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

Mikä yhteyssuhde on?

Mikä yhteyssuhde on? 1 Yhteyssuhde Mikä yhteyssuhde on? Yhteyssuhde Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä yhteyssuhde on? Tili - : String - : double * 1 Asiakas - hetu: String - : String

Lisätiedot

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus? Osa III 11. oppitunti Viittaukset Kahdessa viime luvussa opit käyttämään osoittimia kohteiden käsittelyyn vapaalla muistialueella sekä viittaamaan noihin kohteisiin epäsuorasti. Tässä luvussa käsiteltävät

Lisätiedot

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen

Lisätiedot

Listarakenne (ArrayList-luokka)

Listarakenne (ArrayList-luokka) Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen

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

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19 Ohjelmointikieli TIE-20306 Principles of Programming Languages Syksy 2017 Ryhmä 19 Juho Kärnä Ville Mäntysaari 1. Johdanto D on yleiskäyttöinen, strukturoitu, staattisesti tyypitetty, käännettävä ohjelmointikieli

Lisätiedot

TIE Principles of Programming Languages CEYLON

TIE Principles of Programming Languages CEYLON TIE-20306 Principles of Programming Languages CEYLON SISÄLLYSLUETTELO 1. YLEISTIETOA KIELESTÄ JA SEN KEHITTÄMISESTÄ... 1 2. CEYLONIN OMINAISUUKSIA... 2 2.1 Modulaarisuus... 2 2.2 Tyypit... 2 2.3 Muita

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen Riku Saikkonen 28. 11. 2011 Sisältö 1 Miten oliot ja metodikutsut toimivat? 2 Oliot Minkä luokan metodia kutsutaan? Python-esimerkki

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

Kääntäjän virheilmoituksia

Kääntäjän virheilmoituksia OHJ-1101 Ohjelmointi 1e 2008-09 1 Kääntäjän virheilmoituksia Kun progvh2 ohjelma käännetään antaa tutg++ seuraavat virheilmoitukset ja varoitukset: proffa> tutg++ progvh2.cc progvh2.cc:29:13: warning:

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

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

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Mallit standardi mallikirjasto parametroitu tyyppi

Mallit standardi mallikirjasto parametroitu tyyppi Mallit 18 Mallit Malli on tehokas mekanismi uusien luokkien generoimiseksi automaattisesti. Standardikirjaston suuri osa, standardi mallikirjasto, rakentuu kokonaan mallien määrittelymahdollisuuden ympärille,

Lisätiedot

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

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

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

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

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja) Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Tässä osassa tutustutaan yhteen rakennemalliin (Proxy) ja kolmeen luontimalliin (Factory Method, ) teoksen [Gam] pohjalta.

Lisätiedot

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009 TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 27. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Kääntäjän rakenne

Lisätiedot

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmointiharjoituksia Arduino-ympäristössä Ohjelmointiharjoituksia Arduino-ympäristössä Yleistä Arduino-sovelluksen rakenne Syntaksi ja käytännöt Esimerkki ohjelman rakenteesta Muuttujat ja tietotyypit Tietotyypit Esimerkkejä tietotyypeistä Ehtolauseet

Lisätiedot

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013

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