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

Samankaltaiset tiedostot
7. Oliot ja viitteet 7.1

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

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

16. Javan omat luokat 16.1

Mikä yhteyssuhde on?

9. Periytyminen Javassa 9.1

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

UML ja luokkien väliset suhteet

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

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

9. Periytyminen Javassa 9.1

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

Olio-ohjelmointi Javalla

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

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

2. Olio-ohjelmoinista lyhyesti 2.1

4. Olio-ohjelmoinista lyhyesti 4.1

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

Metodien tekeminen Javalla

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

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

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

12. Monimuotoisuus 12.1

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

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

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

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

Javan perusteita. Janne Käki

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Periytyminen (inheritance)

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

Listarakenne (ArrayList-luokka)

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

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

Oliot viestivät metodeja kutsuen

Luokan sisällä on lista

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

20. Javan omat luokat 20.1

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

12. Monimuotoisuus 12.1

Java kahdessa tunnissa. Jyry Suvilehto

19. Olio-ohjelmointia Javalla 19.1

Luokat ja oliot. Ville Sundberg

1 Tehtävän kuvaus ja analysointi

Vahva koostumussuhde (Composition)

15. Ohjelmoinnin tekniikkaa 15.1

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

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

14. Poikkeukset 14.1

Java-kielen perusteet

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

7/20: Paketti kasassa ensimmäistä kertaa

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

17. Javan omat luokat 17.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

17. Javan omat luokat 17.1

Hakemistojen sisällöt säilötään linkitetyille listalle.

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Sisällys. 19. Unified Modeling Language (UML) Johdanto. Johdanto. Johdanto. Luokkakaavio:

Metodien tekeminen Javalla

Ohjelmointi 2 / 2010 Välikoe / 26.3

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmointi 2, välikoe

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

15. Ohjelmoinnin tekniikkaa 15.1

P e d a c o d e ohjelmointikoulutus verkossa

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

KOHDELUOKAN MÄÄRITTELY

Rajapinta (interface)

YHTEYSSUHDE (assosiation)

Muutamia peruskäsitteitä

12. Näppäimistöltä lukeminen 12.1

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

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

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

Mitä on periytyminen?

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

14. Poikkeukset 14.1

Luokan muodostimet (Constructors)

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

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

1. Omat operaatiot 1.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

P e d a c o d e ohjelmointikoulutus verkossa

19. Unified Modeling Language (UML)

18. Abstraktit tietotyypit 18.1

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

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

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Ohjelmoinnin perusteet Y Python

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

Antti-Jussi Lakanen Ohjelmointi 1, C# / kevät 2011

Jypelin käyttöohjeet» Ruutukentän luominen

- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined

Transkriptio:

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 toteutetaan sijoittamalla A-tyyppinen attribuutti luokkaan B. Esim. Ympyrän voidaan ajatella ympyrän osaksi. public class Ympyra { Ympyrä säde private Piste2D ; private double sade;... x y Piste2D 17.2

Osaoliot Koostesuhteen seurauksena ohjelman ajonaikana luokan B oliolla on tyypillisesti A- luokan osaolio, jonka luominen ja tuhoaminen on usein isäntäolio vastuulla. Javassa riittää yleensä luominen. Esim. Luodaan rakentajassa. public Ympyra() { // Ympyrä oletusarvoisesti // yksikköympyrä. = new Piste2D(0, 0); sade = 1; Esim. Olioiden luominen. // Ympyrää luotaessa // luodaan myös osaolio. Ympyra a = new Ympyra(); a sade = 1 x = 0 y = 0 17.3

Pintakopiointi Koostesuhteen tuottamat osaoliot ovat haasteellisia, kun oliosta täytyy luoda kopio. Object-luokan clone-metodi kopioi oletusarvoisesti alkeistyyppisten attribuuttien arvot, mutta viitetyyppisten parametrien osalta tapahtuu vain pintakopiointi (shallow copy), jossa kopioidaan viitteet, jolloin alkuperäisen ja kopioidun olion viitetyyppiset attribuutit osoittavat samoihin osaolioihin. Esim. Ympyrän pintakopiointi. // Luodaan ympyrä. Ympyra a = new Ympyra(); // Kopioidaan pinnallisesti clone- // metodilla ja asetetaan kopioon // uusi viite, jolloin isäntäolioilla // on yhteinen osaolio. Ympyra b = (Ympyra)a.clone(); a sade = 1 sade = 1 x = 0 y = 0 b 17.4

Pintakopiointi Pintakopiointi ei ole yleensä ongelma, jos osaoliot on luotu muuttumattomista (immutable) luokista, joiden attribuuttien arvot voi asettaa vain olion luomisen yhteydessä. Alkuperäinen isäntäolio ja sen kopio voivat huoletta viitata samaan osaolioon, koska osaolion tilaa ei voi muuttaa sen luomisen jälkeen. Esimerkiksi String on muuttumaton luokka. Koska muuttumaton luokka on yksinkertainen ja helppo käyttää, joissakin lähteissä suositellaan kaikkien luokkien toteuttamista mahdollisimman pitkälti muuttumattomina. Oope-kurssilla tähän ei pyritä erityisesti. 17.5

Syväkopiointi Kopion tulisi olla alkuperäisestä oliosta riippumaton, jos osaolioina on muuttuvien (mutable) luokkien edustajia. Muuttuvasta luokasta luodun olion tilaa voidaan muuttaa luomisen jälkeen esimerkiksi asetusmetodeilla. Esim. StringBuffer on muuttuva. Riippumattomuus saavutetaan syväkopioinnilla (deep copy), jossa kopio-oliolle luodaan uudet osaoliot, joihin kopioidaan alkuperäisten osaolioiden tiedot. Esim. Ympyrän syväkopiointi. // Luodaan ympyrä. Ympyra a = new Ympyra(); // Syväkopioidaan ympyrä. // (clone-metodi on korvattu nyt // syväkopioivalla tavalla.) Ympyra b = (Ympyra)a.clone(); a sade = 1 x = 0 y = 0 b sade = 1 x = 0 y = 0 17.6

Syväkopiointi Javan clone-metodin käyttö niin pinta- kuin syväkopiointiin on vaikeaa ja vaatii tarkkuutta. Joissakin lähteissä clonemetodia kehotetaan välttämään Vaihtoehtoisilla lähestymistavoilla on omat vahvuutensa ja heikkoutensa. Kopiorakentajat lienevät yksinkertaisin tapa kopioida olio Javassa. Ongelmana osaolioiden luokkien tunnistus. Kopiorakentaja saa parametrinaan viitteen kopioitavaan olioon. Rakentaja kopioi parametrinsa tiedot pinnallisesti tai syvällisesti. Ennen kopiointia kutsutaan esi-isien kopiorakentajia ketjussa. Esim. Ympyrän kopiorakentaja. public Ympyra(Ympyra y) { // Yliluokan kopiorakentajan kutsu. super(y); if (y instanceof Ympyra) { sade(y.sade()); 17.7

Syväkopiointi Syväkopiointia hyödynnetään myös lukumetodeissa. Luokan lukumetodeissa voidaan estää muuttuvista luokista luotujen osaolioiden tilan muuttaminen luokan ulkopuolella syväkopioimalla osaolio ja palauttamalla viite tähän kopioon. Esim. Ympyrän en lukumetodi. public Piste2D () { // Luodaan uusi olio siten, että sen arvot ovat samat kuin osaolion. // ja liitetään kopio-olioon viite. Piste2D osankopio = new Piste2D(.x(),.y()); // Palautetaan viite kopioon. return osankopio; 17.8

Eläimen syväkopiointi Kissa hassu = new Kissa(true, 2, new Aivot(15), "harmaa", "kippura"); Kissa hassu2 = new Kissa(hassu); public Kissa(Kissa k) { // Kutsutaan yliluokan kopiorakentajaa. super(k); // Muuttumattomille olioille // riittää pintakopiointi. vari(k.vari()); hanta(k.hanta()); public Nisakas(Nisakas n) { // Kutsutaan yliluokan kopiorakentajaa. super(n); // Kopioidaan nisäkkään attribuutti. turkillinen(n.turkillinen()); 17.9

Eläimen syväkopiointi public Elain(Elain e) { // Tarkistetaan, että viitteeseen liittyy eläinolio. if (e instanceof Elain) { // Kopioidaan alkeistyyppiset arvot suoraan. elossa(e.elossa()); paino(e.paino()); // Luodaan uusi osaolio siten, että sen arvot ovat samat kuin // kopioitavan olion osaolion. Aivot kopioaivo = new Aivot(e.aivot().tilavuus()); // Asetetaan rakennettavasta oliosta viite uuteen osaolioon. aivot(kopioaivo); 17.10