Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Koko: px
Aloita esitys sivulta:

Download "Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter"

Transkriptio

1 Olio-ohjelmointi Suunnittelumallit Adapter ja Composite Rakennemalleissa päähuomio kohdistetaan siihen, miten luokkia ja olioita yhdistellään muodostamaan laajempia rakenteita. Rakenteelliset luokkamallit käyttävät enimmäkseen periytymistä niiden luomiseksi, kun taas rakenteelliset oliomallit kuvaavat, miten saadaan aikaan uusia toimintoja olioita yhdistelemällä. Tässä osassa tutustutaan kahteen rakennemalliin (Adapter eli Sovitin ja Composite eli Rekursiokooste) suurimmaksi osaksi lähteen [Gam] pohjalta. 1. Adapter Olio-ohjelmoinnissa sattuu varsin usein, että käytettävissä on luokka, jonka toiminta vastaa ohjelman vaatimuksia, mutta sen rajapinta ei sovellu uuteen ympäristöön tai sen käyttö on hankalaa uudessa ympäristössä. Ongelma kohdataan usein pyrittäessä uudelleenkäyttöön. Luokka voi olla kirjastoluokka tai muuten sellainen, että sen rajapintaa ei voi muuttaa. Ongelma voidaan usein ratkaista kirjoittamalla sovitinluokka vanhan luokan ja uuden ohjelmakoodin väliin. Ratkaisu tunnetaan Adapter- eli Sovitin-suunnittelumallina. Javan luokkakirjastoissa mallia käytetään usein. Tutustutaan hieman graafisen käyttöliittymän ohjelmointiin käyttäen Swing-luokkia. Graafiseen käyttöliittymän perustuvan sovelluksen on aina perittävä ikkunaluokka JFrame, jotta voitaisiin toteuttaa sovelluksen pääikkuna. Usein laajennetaan suoraan luokkaa JFrame, mutta myös siitä perittyjä luokkia voi käyttää sovelluksen luokkana. Toteutus tapahtuu niin, että määritellään sovelluksen luokka JFramen aliluokaksi, sen muodostimessa tai muussa metodissa tehdään ikkunan alustustoimenpiteet. Yleensä mainmetodissa luodaan ikkuna ja näytetään se omassa säikeessään. Seuraavassa esimerkissä sovellus ainoastaan avaa uuden ikkunan, jonka otsikkona on Varsin mallikas ikkuna. Sovelluksen toteuttavan luokan nimeksi annetaan EkaIkkuna ja sen konstruktorissa annetaan sille otsikko ja asetetaan sen koko. Sovelluksen päämetodissa luodaan uusi olio luokasta ja näytetään se luotavassa uudessa säikeessä Frame-luokan setvisible() - metodilla. Huomaa, että jos tämä lause jätetään pois ohjelmasta, ikkuna kyllä luodaan, mutta se jää näkymättömiin. 1

2 Esimerkki. Ikkunan luova sovellus: import javax.swing.*; class EkaIkkuna extends JFrame { public EkaIkkuna() { // Annetaan ikkunalle otsikko this.settitle("varsin mallikas ikkuna."); // Määrätään ikkunan koko this.setsize(300,100); public void laitaesiin() { // Laitetaan näkyviin setvisible(true); public static void main(string[] args) { // Luodaan uusi EkaIkkuna -olio final EkaIkkuna akkuna = new EkaIkkuna(); ); // Näytetään ikkuna omassa säikeessään javax.swing.swingutilities.invokelater(new Runnable() { public void run() { akkuna.laitaesiin(); Ikkunan luomiseksi ei siis tarvita paljonkaan koodia, mutta edellistä sovellusta tutkittaessa huomataan, että mikäli ikkuna suljetaan normaaliin tapaan, jää itse sovellus vielä pyörimään ja se on lopetettava kirjoittamalta konsolilta Ctrl-c. Tämä vakavasti otettavissa sovelluksissa kiusallinen ominaisuus on JFrame-ikkunan sulkemisesta aiheutuva oletustapahtuma. Sovelluksen lopettaminen voidaan tehdä muuttamalla oletustapahtumaa tai, kuten seuraavassa, sopivan rajapinnan avulla. Kun painetaan hiirellä otsikkopalkin ristiä, aiheutuu ikkunatapahtuma, mutta sovellus ei reagoi siihen odotetusti. Javassa ikkunatapahtumia voidaan käsitellä sovelluksissa toteuttamalla AWTkirjastoon kuuluva WindowListener-rajapinta. Tämä rajapinta käsittää metodit 2

3 public void windowopened(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna on avattu public void windowclosed(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna on suljettu public void windowactivated(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna on aktivoitu public void windowdeactivated(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna menettää aktiivisuutensa public void windowiconified(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna pienennetään public void windowdeiconified(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna suurennetaan public void windowclosing(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna suljetaan Sovelluksiin ei tarvitse aina liittää toimintoa jokaista ikkunatapahtumaa varten. Kun rajapinta toteutetaan, on kuitenkin sen jokainen metodi implementoitava. Tällaisessa tapauksessa riittää kun kirjoittaa tyhjän metodirungon niihin metodeihin, jotka vastaavat sovelluksen kannalta yhdentekeviä tapahtumia. Kun halutaan toteuttaa ainoastaan ikkunan sulkeminen, tarvitaan vain windowclosing()-metodiin koodia. Jotta voitaisiin käyttää rajapinnan metodeja, on koodissa toteutettava seuraavat asiat: 1) Luokan on toteutettava WindowListener rajapinta, mitä varten on myös importoitava java.awt.event-paketti. 2) On kirjoitettava kaikki rajapinnan metodit ja niistä windowclosing() metodiin lause System.exit(0); mikäli sovelluksen halutaan loppuvan ikkunan sulkemiseen. 3) Luotuun ikkunaan on lisättävä ikkunatapahtumien kuuntelija. Tämän voi tehdä kutsumalla ikkunan metodia addwindowlistener(). Usein kuuntelijaksi ilmoitetaan olio itse ja sen luokkaan kirjoitetaan tapahtumat käsittelevä koodi, mutta tapahtuman kuuntelijaolio voi olla jokin muukin. Kun tehdään nämä muutokset EkaIkkuna-luokan koodiin, saadaan seuraava sovellus: 3

4 import javax.swing.*; import java.awt.event.*; class TokaIkkuna extends JFrame implements WindowListener { public TokaIkkuna() { // Kuten edellisessä esimerkissä public void laitaesiin() { // Laitetaan näkyviin setvisible(true); // Lisätään ikkunaan kuuntelijaksi se itse! addwindowlistener(this); public static void main(string[] args) { // Luodaan uusi TokaIkkuna -olio final TokaIkkuna akkuna = new TokaIkkuna(); ); // Näytetään ikkuna omassa säikeessään javax.swing.swingutilities.invokelater(new Runnable() { public void run() { akkuna.laitaesiin(); /* Nämä metodit on rajapinnan takia implementoitava, mutta niiden rungot voidaan jättää tyhjiksi */ public void windowopened(windowevent e){ public void windowclosed(windowevent e) { public void windowactivated(windowevent e) { public void windowdeactivated(windowevent e) { public void windowiconified(windowevent e) { public void windowdeiconified(windowevent e) { // Vain tähän metodiin tarvitaan koodia! public void windowclosing(windowevent e) { System.exit(0); Nyt päästään Adapter-suunnittelumallin sovellukseen. Mikäli toteuttaa usein edellisen kaltaisia ikkunoita, tyhjien ikkunatapahtumametodien kirjoittaminen alkaa rasittaa mieltä. Siksi Javaan on toteutettu luokka WindowAdapter, joka toimii sovittimena WindowListener-rajapinnan ja ikkunaohjelman välillä. Sovittimeen on valmiiksi kirjoitettu kaikki rajapinnan vaatimat metodit tyhjinä. Näin ollen ohjelmoijan tarvitsee ainoastaan kirjoittaa luokka, joka perii luokan WindowAdapter ja uudelleenmääritellä haluamansa metodit. Tällöin pitää luonnollisesti lisätä ikkunan kuuntelijaksi uuden luokan olio. Esimerkiksi edellisen esimerkin ohjelmasta muodostuisi seuraavan kaltainen: 4

5 import javax.swing.*; import java.awt.event.*; class Poistu extends WindowAdapter { public void windowclosing(windowevent e){ System.exit(0); class TokaIkkunaAdapter extends JFrame { public TokaIkkunaAdapter() { // Kuten ennen public void laitaesiin() { // Laitetaan näkyviin setvisible(true); // Lisätään ikkunaan kuuntelijaksi Lopeta-olio addwindowlistener(new Poistu()); public static void main(string[] args) { // Luodaan uusi TokaIkkunaAdapter -olio final TokaIkkunaAdapter akkuna = new TokaIkkunaAdapter(); ); // Näytetään ikkuna omassa säikeessään javax.swing.swingutilities.invokelater(new Runnable() { public void run() { akkuna.laitaesiin(); Näin selvitään hieman pienemmällä vaivalla ja koodikin on vähän siistimpi. Kiinnostunut lukija löytää lisää tietoa Swing-komponenttien käytöstä lähteestä [Jav]. Adapter-mallin tarkoitus voidaan siis kuvata seuraavasti: Muuntaa luokan rajapinnan asiakkaiden vaatimaan muotoon ja mahdollistaa muuten rajapinnoiltaan yhteensopimattomien luokkien yhteistoiminnan. Adapteria voi soveltaa ainakin seuraaviin tapauksiin: Halutaan käyttää valmista luokkaa, jonka rajapinta ei vastaa tarpeita. Halutaan luoda uudelleenkäytettävä luokka, joka tulee toimimaan toistaiseksi tuntemattomien luokkien kanssa. On käytettävä useaa olemassa olevaa aliluokkaa, mutta ei ole käytännöllistä periä niitä kaikkia. Oliosovitin voi sovittaa yliluokkansa rajapinnan. 5

6 Adapter-mallista on kaksi muotoa: luokkasovitin ja oliosovitin. Luokkasovittimessa sovitettava luokka peritään sovitinluokkaan, kun taas oliosovittimessa sovitinluokka sisältää sovitettavan luokan olion osaolionaan. Alla on luokkasovittimen luokkakaavio: Kuva 1. Adapter-mallin luokkaversio. (Vrt. [Gam]) Huomaa, että malli käyttää moniperiytymistä. Tässä siis oletetaan, että on olemassa valmis luokka Adaptee, joka halutaan sovittaa vastaamaan asiakasluokan Request()-kutsuun. Adapteeluokassa onkin toiminnaltaan sopiva metodi, mutta se on nimeltään SpecificRequest(). Tässä tapauksessa Adaptee peritään luokkaan Adapter, johon kirjoitetaan metodi Request() kutsumaan Adaptee-luokan SpecificRequest-metodia. Olioversion luokkakaavio on seuraavan kaltainen: Kuva 2. Adapter-mallin olioversio. (Vrt. [Gam]) Yllä olevassa versiossa ei tarvitse käyttää moniperiytymistä, koska Adapteesta tulee nyt Adapterin osaolio. 6

7 Mallin osallistujat ovat siis Target Määrittelee sovelluskohtaisen rajapinnan, jonka kautta se voi kommunikoida Clientin kanssa. Client Kommunikoi olioiden kanssa Targetin määräämän rajapinnan kautta. Adaptee Määrittelee rajapinnan, joka on sovitettava uuteen ympäristöön Adapter Sovittaa Adapteen rajapinnan Targetin määräämään rajapintaan. Mallin version valintaan vaikuttaa, miten sovitinta käytetään. Oletetaan, että luokalla Adaptee on aliluokkia ja sen aliluokissa on määritelty operaatioita, jotka on myös sovitettava. Esimerkiksi yllä metodi SpecificRequest voisi olla uudelleenmääritelty Adaptee-luokan aliluokissa. Mikäli joissain tapauksissa olisi suoritettava aliluokan metodi, on käytettävä oliosovitinta. Perittäessähän luokka Adapter perisi ainoastaan Adaptee-luokan toteutuksen. Jos taas Adapterluokan on uudelleenmääriteltävä joitakin Adaptee-luokan toimintoja, on syytä käyttää luokkasovitinta. Aliluokassa uudelleenmäärittely on helpompi toteuttaa. Esitetään vielä esimerkki suunnittelumallin käytöstä. Oletetaan, että ohjelmassa on luokka StringContainer, joka sisältää jäsenmuuttujanaan String-taulukon. Syystä tai toisesta taulukon merkkijonoille on tehtävä jokin mutkikas operaatio ja palautettava muokattu taulukko. Luokan määrittely olisi class StringContainer { private: std::string* stringtable; int length; StringContainer(std::string* intable, int len); ~StringContainer(); int getlength() const; ; // Muokkaa stringtablen merkkijonot ja // palauttaa muokatun taulukon std::string* getmodifiedstrings() const; Tässä vaiheessa huomataankin, että on olemassa kirjastoluokka StringVectorModifier, jonka metodi modify tekee halutun operaation, mutta ei käytäkään taulukkoja vaan C++:n standardikirjaston kokoelmaluokkaa vector. class StringVectorModifier { void modify(std::vector<std::string> &strings); ; Näin ollen luokka StringContainer ei voi suoraan käyttää luokan metodia. Mikäli luokkaa StringContainer ei voida muuttaa, on kätevintä soveltaa Adapter-mallia. Nyt luokka StringContainer vastaa mallin kuvauksessa luokkaa Client ja luokka StringVectorModifier luokkaa Adaptee. Seuraavaksi tarvitaan luokkaa Target vastaava luokka; tämän on sisällettävä metodi, jota voidaan kutsua luokasta StringContainer: 7

8 class StringArrayModifier { virtual std::string* modifyarray(std::string *array, int length)=0; ; Luokan metodilla ei tarvitse olla lainkaan toteutusta, koska luokka peritään luokkaan, joka toteuttaa metodin. Siten metodi voidaan jättää edellisessä luokassa puhtaasti virtuaaliseksi. Tämän jälkeen voidaan kirjoittaa varsinainen sovitinluokka VectorArrayAdapter, joka siis vastaa mallin kuvauksessa luokkaa Adapter. Tehdään ensin mallista luokkaversio, jolloin VectorArrayAdapter perii sekä luokan StringVectorModifier että luokan StringArrayModifier: // Tiedosto VectorArrayAdapter.h class StringAdapter: private StringVectorModifier, public StringArrayModifier { std::string* modifyarray(std::string* array, int length); ; // Tiedosto VectorArrayAdapter.cpp std::string* VectorArrayAdapter::modifyArray(std::string* array, int length){ // Määrittele string-olioita sisältävä vector strings // Kirjoita taulukon array sisältämät merkkijonot // vectoriin strings // Muunna vectorin strings sisältö modify(strings); // Luo uusi taulukko modified_table, kirjoita // vectorin strings merkkijonot siihen // ja palauta taulukko return modified_table; Lopulta on enää lisättävä muunnoksen kutsuminen luokkaan StringContainer. Metodi getmodifiedstrings() voidaan toteuttaa nyt seuraavasti: std::string* StringContainer::getModifiedStrings() const { VectorArrayAdapter va; std::string *modifiedstrings = va.modifyarray(stringtable, length); return modifiedstrings; Käytännön sovelluksissa kannattaa huomata, että metodin palauttama taulukko on dynaamisesti luotu, joten sen tuhoaminen jää kutsujan vastuulle. 8

9 Edellisen ohjelman suunnittelumallin olioversio on muuten samanlainen kuin edellinen, mutta nyt VectorArrayAdapter ei peri luokkaa StringVectorModifier, vaan sisältää StringVectorModifier-olion osanaan. Muutoksia tulee siis ainoastaan luokkaan VectorArrayAdapter: // Tiedosto VectorArrayAdapter.h class VectorArrayAdapter: public StringArrayModifier { private: // Vector modifier as an attribute StringVectorModifier svmmodifier; std::string* modifyarray(std::string* array, int length); ; // Tiedosto VectorArrayAdapter.cpp std::string* VectorArrayAdapter::modifyArray(std::string* array, int length){ // Määrittele string-olioita sisältävä vector strings // Kirjoita taulukon array sisältämät merkkijonot // vectoriin strings // Muunna vectorin strings sisältö svmmodifier.modify(strings); // Luo uusi taulukko modified_table, kirjoita // vectorin strings merkkijonot siihen // ja palauta taulukko return modified_table; 9

10 2. Composite Composite- eli Rekursiokooste-mallin juuret ovat graafisten käyttöliittymäliittymäkomponenttien rakentamisessa. Komponenttien muodostamaa koostetta voidaan käyttöliittymässä käsitellä yksittäisenä komponenttina. Suunnittelumalli syntyy, kun yleistetään tilannetta: muissakin yhteyksissä tarvitaan olioiden ryhmiä, joita halutaan käsitellä kuin yksittäistä oliota. Mallin avulla voidaan luoda luokkahierarkia, jonka eräät luokat määrittelevät alkeisolioita (kuten primitiiviset käyttöliittymäkomponentit) ja toiset luokat määrittelevät yhdisteolioita, jotka koostavat alkeisolioita monimutkaisemmiksi yhdistelmiksi. Rekursiokooste-mallia käsitellään myös kurssissa Oliosuuntautunut analyysi ja suunnittelu. Suunnittelumallin tarkoitus on järjestää oliot puuhierarkioiksi, jotka kuvaavat osa-kokonaisuussuhteita. Malli tekee mahdolliseksi osien ja kokonaisuuksien yhdenmukaisen käsittelyn. Mallin luokkarakenne on kuvattu alla Kuva 3. Composite-mallin luokkakaavio. (Vrt. [Gam]) Component on sekä primitiivisten olioiden (Leaf) että yhdistelmäolioiden (Composite) kantaluokka. Kaaviosta käy ilmi, että Composite-luokka voi sisältää Component-olioita, jotka voivat nyt olla joko Leaf-luokan tai edelleen Composite-luokan olioita. 10

11 Tyypillinen mallia käyttävä oliorakenne voisi olla Kuva 4. Composite-mallin tyypillinen oliokaavio. Mallin toimijat ovat siis Component, joka määrittelee käytettävien olioiden rajapinnan. Toteuttaa oletustoiminnot kaikille luokille. Määrittelee rajapinnan lapsiluokkiensa käsittelyyn. Leaf, joka esittää primitiivisiä koosteen olioita. Leaf-olioilla ei ole lapsia. Composite, joka määrittelee toiminnot niille olioille, joilla voi olla lapsia. Toimii säiliönä lapsikomponenteille. Toteuttaa lapsien käsittelyyn liittyvät Componetrajapinnan operaatiot. Client, joka käsittelee koosteen olioita Component-rajapinnan kautta. Suunnittelumallilla on useita etuja. Sen avulla asiakasluokan koodi voidaan pitää yksinkertaisena, koska sekä yhdistelmäolioita että primitiivisiä olioita voidaan käsitellä yhdenmukaisesti. Asiakasolion ei yleensä tarvitse tietää, käsitteleekö se komponenttia vai primitiivistä oliota. Lisäksi on helppoa lisätä uusia komponentteja ohjelmaan, sillä uusien aliluokkien oliot toimivat automaattisesti entisen ohjelmakoodin kanssa. Siten asiakasolion koodia ei tarvitse muuttaa lisättäessä uusia komponenttiluokkia. Toisaalta mallin yleisyys voi aiheuttaa vaikeuksia. Joskus pitäisi rajoittaa komponentin sisältämien olioiden tyyppiä; tämän voi käytännössä toteuttaa vain ajonaikaisilla tyypintarkistuksilla. 11

12 Tarkastellaan esimerkkiä: Toteutetaan laitevarasto Composite-suunnittelumallin avulla. Varastossa voi olla erilaisia laitteita, joihin voi kuulua erilaisia osakomponentteja. Luokan kantaluokaksi laaditaan mallin mukaan seuraava abstrakti luokka: class EquipmentComponent { virtual void operation()=0; virtual void add(equipmentcomponent *component)=0; virtual void remove(equipmentcomponent *component)=0; virtual EquipmentComponent* getchild(int index)=0; virtual ~EquipmentComponent(){ ; Kaikki varastossa olevat laitteet perivät tämän luokan, myös varasto-olio itse. Huomaa, että luokan aliluokissa metodeista tulee dynaamisesti sidottavia virtual-määreen takia. Toteutetaan tässä varastoluokka, kameraluokka ja objektiiviluokka. Kameraan voi liittyä yksi tai useampia objektiiveja, objektiivi voi olla myös itsenäisenä varastossa. Objektiivit eivät voi sisältää komponentteja, joten ne ovat primitiivisiä olioita: niiden luokka vastaa mallin kuvauksen Leafluokkaa. Varastoluokka ja kameraluokka ovat Composite-tyyppisiä luokkia. Toteutetaan aluksi objektiivia kuvaava luokka: // Tiedosto Objective.h class Objective: public EquipmentComponent { private: std::string name; Objective(std::string s); ~Objective(){ void operation(); void add(equipmentcomponent *component); void remove(equipmentcomponent *component); EquipmentComponent* getchild(int index); ; // Tiedosto Objective.cpp Objective::Objective(std::string s): name(s) { void Objective::operation() { std::cout << "Objective: " << name << std::endl; void Objective::add(EquipmentComponent *component) { throw std::runtime_error("no adding in leaf"); void Objective::remove(EquipmentComponent *component){ throw std::runtime_error("no removing from leaf"); EquipmentComponent* Objective::getChild(int index) { throw std::runtime_error("no components in leaf"); 12

13 Yllä, samoin kuin jatkossa muussakin koodissa on jätetty mainitsematta käytetyt includetiedostot. Tässä tapauksessa oliolle suoritettava operaatio vain tulostaa sen nimen. Primitiivisellä oliolla ei voi olla lapsia, joten niiden käsittelymetodit heittävät poikkeuksen. Seuraavaksi kirjoitetaan kameraa kuvaava luokka, joka on Composite-tyyppinen. Siten siihen on lisättävä lapsien käsittelymetodit. // Tiedosto Camera.h class Camera : public EquipmentComponent { typedef std::vector<equipmentcomponent*> ComponentVector; private: std::string name; ComponentVector children; Camera(std::string s); ~Camera(){; ; void operation(); void add(equipmentcomponent *component); void remove(equipmentcomponent *component); EquipmentComponent* getchild(int index); // Tiedosto Camera.cpp Camera::Camera(std::string s):name(s) { void Camera::operation() { std::cout << "Camera " << name << " with objectives:" << std::endl; ComponentVector::iterator iter; for(iter = children.begin(); iter!= children.end(); iter++) { (*iter)->operation(); std::cout <<" "<<std::endl; void Camera::add(EquipmentComponent *component) { children.push_back(component); void Camera::remove(EquipmentComponent *component){ ComponentVector::iterator iter; iter = std::find(children.begin(),children.end(),component); if(iter!= children.end()){ children.erase(iter); EquipmentComponent* Camera::getChild(int index) { return children.at(index); 13

14 Komponentin lapset sijoitetaan vector-tyyppiseen kokoelmaan. Tällä kertaa operaationa on tulostaa olion nimi ja tehdä kaikille lapsiolioille niiden operaatio. Lisäämiseen ja poistamiseen käytetään vector-luokan metodeja, vectorin selaajaa ja STL-kirjaston algoritmia find. Laaditaan vielä koko varastoa kuvaava luokka (joka voisi myös olla esimerkiksi varaston kameraosasto ja voitaisiin liittää yleisempään laitevarastoon): // Tiedosto EquipmentStore.h class EquipmentStore : public EquipmentComponent { typedef std::vector<equipmentcomponent*> ComponentVector; private: ComponentVector children; EquipmentStore() { ~EquipmentStore(){ void operation(); void add(equipmentcomponent *component); void remove(equipmentcomponent *component); EquipmentComponent* getchild(int index); ; // Tiedosto EquipmentStore.cpp // Muut metodit kuten luokassa Camera void EquipmentStore::operation(){ std::cout << "Store contains following items:" << std::endl; std::cout << "*******************************************" << std::endl; ComponentVector::iterator iter; for(iter = children.begin(); iter!= children.end(); iter++) { (*iter)->operation(); std::cout << "*******************************************" << std::endl; Koodi on operation()-metodia lukuun ottamatta samanlainen kuin luokassa Camera. Lopuksi voitaisiin kirjoittaa luokkia käyttävä asiakasohjelma esimerkiksi seuraavasti: 14

15 int main() { EquipmentComponent *objective1, *objective2, *objective3, *objective4; EquipmentComponent *camera1, *camera2, *camera3; EquipmentComponent *store = new EquipmentStore(); objective1 = new Objective("Tamron "); objective2 = new Objective("Nikon 50"); objective3 = new Objective("Canon "); objective4 = new Objective("Leica 350"); camera1 = new Camera("Canon 1000"); camera2 = new Camera("Leica"); camera3 = new Camera("Nikon pocket"); store->add(camera1); store->add(camera2); store->add(camera3); store->add(objective2); camera1->add(objective1); camera1->add(objective3); camera2->add(objective4); store->operation(); camera1->remove(objective1); store->remove(camera2); store->operation(); // Tuhotaan kekodynaamiset oliot return 0; Tässä luodaan pieni kameravarasto, tulostetaan se, poistetaan yksi kamera ja yksi objektiivi. Lopuksi tulostetaan muokattu varasto. Jos edellisessä ohjelmassa yritettäisiin poistaa komponenttia objektiivista, ajauduttaisiin poikkeustilanteeseen. Koodissa näkyy kuitenkin heikkous, joka aiheutuu mallin yleisyydestä: Kameraolion komponentiksi voitaisiin vaikeuksitta lisätä varasto-olio, vaikka loogisesti se ei ole järkevää. Näin ollen ohjelmassa pitäisi rajoittaa kameran sisältämien komponenttien tyyppi objektiiviksi. Tehdään vielä lopuksi joitakin huomioita Composite-mallin toteutuksesta. Joskus on käytännöllistä pitää lapsikomponenteissa yllä viitettä niiden vanhempaan, toisin sanoen komponenttiin, joka sisältää ko. lapsikomponentin. Tällöin on kiinnitettävä huomiota siihen, että viitteet pysyvät kunnossa, kun rakenteeseen lisätään tai siitä poistetaan komponentteja. Edelleen komponenttien jakaminen voi hankaloitua, mikäli komponentilla voi olla vain yksi vanhempi. Sekä primitiiviset oliot (mallissa luokka Leaf) että alikomponentteja sisältävät komponentit (mallissa luokka Composite) perivät luokan Component. Jotta kummankin tyyppisiä komponentteja voitaisiin käsitellä mahdollisimman yhtenäisesti, tulisi Component-luokan esitellä mahdollisimman monta näiden luokkien yhteistä operaatiota. Tämä kuitenkin rikkoo tietyssä mielessä olio-ohjelmoinnin periaatetta, jonka mukaan kantaluokkaan tulisi määritellä ainoastaan kaikille aliluokille käyttökelpoisia metodeja. Monet operaatiot ovat hyödyllisiä Compositeluokissa, mutta hyödyttömiä Leaf-luokissa, esimerkiksi lapsiin liittyvät operaatiot. Yksi tapa ratkaista asia on kirjoittaa Component-luokkaan sellaiset oletustoteutukset, jotka soveltuvat Leaf- 15

16 luokille. Composite-aliluokat sen sijaan määrittelevät ne tarvittaessa uudelleen. Aiemmassa esimerkissä kantaluokan metodit on jätetty tyhjiksi ja siirretty poikkeuksen aiheuttaminen Objective-luokan metodeihin. Jos haluaa korostaa turvallisuutta käsittelyn yhtenäisyyden kustannuksella, voi siirtää lapsien käsittelymetodit kokonaan Composite-luokkiin. Komponenttien muodostamasta rakenteesta poistetaan olioita dynaamisesti. Oliot on tällöin tuhottava, etteivät ne jää kuormittamaan muistia. Kielissä, joissa ei ole toteutettu roskien keruuta (esimerkiksi C++), on jollekin toimijalle annettava vastuu muistin vapauttamisesta. Yleensä ohjelma suunnitellaan niin, että komponentti tuhoutuessaan tuhoaa myös lapsensa. Edellä Composite-tyyppiset oliot (Camera ja EquipmentStore) on kuitenkin yksinkertaisuuden vuoksi toteutettu siten, että ne eivät ole vastuussa lapsiensa tuhoamisesta, vaan oletetaan, että oliot tuhotaan muualla. Mainittakoon, että Java-kielellä toteutettaessa ominaisuudesta ei syntyisi ongelmaa, koska sen automaattinen roskien keruu vapauttaa oliot, joihin ei enää ole viitteitä. Lähteet [Gam] Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object- Oriented Software, Addison-Wesley 1995 [Jav] Java tutorials: Creating GUI with Swing (URL: viitattu ) 16

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

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

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

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State 2015 syksy 2. vsk VIII Suunnittelumallit Observer ja State Sisältö 1. Johdanto käyttäytymismalleihin 2. Observer 3. State Suunnittelumallit Observer ja State 2 VIII.1 Johdanto käyttäytymismalleihin Päätarkoitus

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JAVA-OHJELMOINTI 3 op A274615

JAVA-OHJELMOINTI 3 op A274615 JAVA-OHJELMOINTI 3 op A274615 JFC & Swing, Look & Feel, Events Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

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

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

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

Poikkeusten ja tapahtumien käsittely

Poikkeusten ja tapahtumien käsittely Poikkeusten ja tapahtumien käsittely Tässä osassa tarkastellaan poikkeusten ja tapahtumien käsittelyä. Aluksi esitellään poikkeusten käsittelyä yleisesti sekä tarkastellaan siihen liittyviä käsitteitä

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

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

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

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

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

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Ohjelmistotekniikan menetelmät, suunnittelumalleja 582101 - Ohjelmistotekniikan menetelmät, suunnittelumalleja 1 Suunnittelumallit (design patterns) Kuvaus sellaisesta luokkarakenteesta & olioiden vuorovaikutuksesta, joka ratkaisee tietyn yleisen ongelman

Lisätiedot

GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING

GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING Käyttöliittymäkomponentteja Sovelluksen pääikkunan luominen Rinnakkainen toiminnallisuus Miten käyttöliittymä lopetetaan? Ikkunan peruskomponentit Mihin

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

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 1 JAVA RMI Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 2 Table of Contents...1 JAVA RMI...1 Yleistä...4 Arkkitehtuuri...5 Java RMI kerrosarkkitehtuuri...5

Lisätiedot

Olio-ohjelmointi Käyttöliittymä

Olio-ohjelmointi Käyttöliittymä Olio-ohjelmointi 2016 Käyttöliittymä n Javalla on helppo toteuttaa yksinkertainen graafinen käyttöliittymä n AWT/Swing n JFC (Java Foundation Collection) n AWT-sisältää Javan grafiikka GUI-komponmentit

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

8. Näppäimistöltä lukeminen 8.1

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja

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

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

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

P e d a c o d e ohjelmointikoulutus verkossa

P e d a c o d e ohjelmointikoulutus verkossa P e d a c o d e ohjelmointikoulutus verkossa Java-kielen perusteet Teoria ja ohjelmointitehtävät Java-kielen perusteet 3 YLEISKATSAUS KURSSIN SISÄLTÖIHIN 10 JAVA-KIELEN PERUSTEET 10 OPISKELUN ALOITTAMINEN

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

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

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

Luokat ja oliot. Ville Sundberg

Luokat ja oliot. Ville Sundberg Luokat ja oliot Ville Sundberg 12.9.2007 Maailma on täynnä olioita Myös tietokoneohjelmat koostuvat olioista Σ Ο ω Μ ς υ φ Ϊ Φ Θ ψ Љ Є Ύ χ Й Mikä on olio? Tietokoneohjelman rakennuspalikka Oliolla on kaksi

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

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys 812347A Olio-ohjelmointi, 2015 syksy 2. vsk V Geneerisyys Sisältö 1. Johdanto geneerisyyteen 2. Geneeriset funktiot 3. Geneeriset luokat 4. Standard Template Library (STL) 5. IOStream-kirjasto 812347A

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti Rinnakkaisohjelmointi kurssi Opintopiiri työskentelyn raportti Opintopiiri: Heikki Karimo, Jesse Paakkari ja Keijo Karhu Päiväys: 15.12.2006 Ohjelmointitehtävä C i C i : Säikeet ja kriittisen vaiheen kontrollointi

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

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

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki Tehtävä 1 Koherentti selitys Koherentti esimerkki ½p ½p Tehtävä 2 Täysiin pisteisiin edellytetään pelaajien tulostamista esimerkin järjestyksessä. Jos ohjelmasi tulostaa pelaajat jossain muussa järjestyksessä,

Lisätiedot

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

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram) 4 Luokkamalli Rakenteet mittojen mukaan. Mitat rakenteen mukaan. Tämän osan sisältö Luokkakaavio luokkakaavion elementti attribuutit operaatiot määreet Olioiden väliset suhteet kytkös kooste yleistys rajapinta

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

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä Olio-ohjelmointi Johdanto suunnittelumalleihin Hyvin toimivan olio-ohjelmointiparadigmaa noudattavan ohjelman suunnitteleminen ei ole helppo tehtävä. On löydettävä sopiva luokkarakenne kuvaamaan ratkaistavaa

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

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

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

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja

Lisätiedot

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 6. Tiedostot 6.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöteja tulostusvirtojen avulla. Tiedostoja voidaan

Lisätiedot

YHTEYSSUHDE (assosiation)

YHTEYSSUHDE (assosiation) YHTEYSSUHDE (assosiation) -Mikä on yhteyssuhde? -Miten toteutan yhteyssuhteen? 1 Mikä on yhteyssuhde? Yhteyssuhde kuvaa kahden olion välistä suhdetta: Esim. Auto Henkilö, omistussuhde Tili Asiakas, omistussuhde

Lisätiedot

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002 JReleaser Yksikkötestaus ja JUnit Mikko Mäkelä 6.11.2002 Sisältö Johdanto yksikkötestaukseen JUnit yleisesti JUnit Framework API (TestCase, TestSuite) Testien suorittaminen eri työkaluilla Teknisiä käytäntöjä

Lisätiedot

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

Lisätiedot

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } } Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin testattaviin toiminnallisuuksiin, kuten olion tarjoamiin metodeihin.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 12.4.2010 T-106.1208 Ohjelmoinnin perusteet Y 12.4.2010 1 / 34 Graafiset käyttöliittymät Tähän asti kirjoitetuissa ohjelmissa on ollut tekstipohjainen käyttöliittymä.

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

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

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

Vesisika. metsiemme työmyyrä. http://www.billybear4kids.com/animal/whose-toes/capybara.jpg

Vesisika. metsiemme työmyyrä. http://www.billybear4kids.com/animal/whose-toes/capybara.jpg Vesisika metsiemme työmyyrä http://www.billybear4kids.com/animal/whose-toes/capybara.jpg Faktat Vesisika tykkää vedestä ja näyttää (ja kuulemma maistuu) hieman sialta. Käyttää myös nickiä kapybara. kapiÿva

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

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2 26. Tiedostot 26.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöte- ja tulostusvirtojen avulla. Tiedostoja

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

Kertaus: yleistys-erikoistus ja perintä

Kertaus: yleistys-erikoistus ja perintä Kertaus: yleistys-erikoistus ja perintä Nauta, Lehmä ja Kuttu ovat Kotieläimiä, Kotieläimet Eläimiä Kotieläimillä (siis myös Naudoilla, Lehmillä ja Kutuilla) on Omistaja Kuttu ja Lehmä toteuttavat rajapinnan

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

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

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

19/20: Ikkuna olio-ohjelmoinnin maailmaan

19/20: Ikkuna olio-ohjelmoinnin maailmaan Ohjelmointi 1 / syksy 2007 19/20: Ikkuna olio-ohjelmoinnin maailmaan Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

Poikkeustenkäsittely

Poikkeustenkäsittely 1 Poikkeustenkäsittely Mitä poikkeustenkäsittely tarkoittaa? Poikkeuksen käsitteleminen Poikkeusluokkien hierarkia Poikkeuksen heittäminen 1 Mitä poikkeustenkäsittely tarkoittaa? Poikkeus (Exception) on

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

Oliosuunnittelu. Oliosuunnittelu

Oliosuunnittelu. Oliosuunnittelu Oliosuunnittelu Perinnän ja dynaamisen sidonnan hyödyntäminen Tarkastellaan ohjelmaa, jonka tehtävänä on tuottaa erilaisista kuvioista muodostuva kuvaesitys Ratkaisu 1: perinteinen malli - ei perintää

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin

Lisätiedot

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 6. Tiedostot 6.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöte- ja tulostusvirtojen avulla. Tiedostoja voidaan

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

Graafinen käyttöliittymä, osa 1

Graafinen käyttöliittymä, osa 1 Graafinen käyttöliittymä, osa 1 Idea, MVC-malli ja ensimmäinen ohjelma Graafinen käyttöliittymä Ensimmäisen kerran tavoitteena on oppia graafisen ohjelman perusidea sekä oppia laatimaan esimerkin mukaan

Lisätiedot

8. Näppäimistöltä lukeminen 8.1

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

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

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

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi Syksy 2013 TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 10 Rinnakkaisuus käyttöliittymäohjelmoinnissa Juha-Matti Vanhatupa Rinnakkaisuus ja käyttöliittymäohjelmointi

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

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

Operaattorin ylikuormitus ja käyttäjän muunnokset

Operaattorin ylikuormitus ja käyttäjän muunnokset 13 Operaattorin ylikuormitus ja käyttäjän muunnokset Luvussa 7, "Ominaisuudet, taulukot ja indeksoijat," opit, miten luokan yhteydessä käytetään ohjelmallisesti []-operaattoria, jolloin objektia voidaan

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