- Ohj2, luennot 11-12, 18.3.-19.3.2005
- Materiaali
- polymorfismi ja rajapinnat
- Polymorfismi
- polymorfismi == monimuotoisuus, sama merkintä voi asiayhteydestä riippuen useita eri asioita
- Funktioiden ja operaattorien kuormitus (overloading)
- Myöhäinen sidonta
- Virtuaalifunktiot: jos perintähierarkiassa on useita samannimisiä metodeja, kutsutaan sen olion metodia, johon muuttuja toxdellisuudessa osoittaa
- Hyödyllistä erityisesti olio-osoittimia (tai viitteitä) käytettäessä
- täydennystä perintään
- Aliluokan oliot tulkitaan automaattisesti yliluokan olioiksi (mutta ei päinvastoin - tyyppimuunnoksella voidaan pakottaa)
- polymorfisten metodien toteutukset voi syrjäyttää aliluokissa ja näin muuttaa olion käyttäytymistä
- C++:ssa metodi voidaan määritellä virtuaalifunktioksi
- Delphissä override-määritys virtuaalifunktioille
- Javassa kaikki metodit ovat virtuaalisia, ellei anneta määritystä final (tällöin samannimistä metodia ei voida kirjoittaa aliluokassa)
- soveltuu käyttöliittymiin: esim. monirivinen tekstikenttä on tavallisen tekstikentän aliluokka
- rajapinnat
- rajapinta == täysin abstrakti luokka, sisältää vain julkisten metodien määrityksiä ilman toteutusta
- javassa runsaasti valmiita rajapintoja, esim. comparable (vertailtava olio), runnable (säikeenä toimiva olio)
- perintä voidaan (mutta ei välttämättä kannata) korvata koostamisella ja rajapinnoilla
- Javassa moniperintää simuloitaessa pakko
- Esim. omaa säiliöluokkaa tehdessä sisäinen toteutus saatetaan koostaa jostain Javan säiliöluokasta - perintää käyttämällä rajapinnasta saattaisi tulla sotkuinen
- C++:ssa myös moniperintä mahdollista, Delphissä ja Javassa moniperintä korvataan rajapinnoilla
- konstruktoreista vielä
- kutsupino perittyjen konstruktorien osalta
- varo virtuaalifunktioiden käyttöä konstruktorissa
- erityisesti, jos yliluokan konstruktori kutsuu aliluokassa olevaa metodia, joka käyttää vielä alustamattomia attribuutteja!
- turvallisinta on, jos konstruktorissa kutsutaan vain private- tai final-metodeita
- ks. tehtävä 9.11 - selvitäänkö ilman syrjäytettyjen metodien kutsuntaa?
- Esimerkit
- Eläimet
- AikaSek-polymorfiset taulukot
- AikaSek8 ja virtuaalifunktioiden kutsut
- AikaE ja AikaF
- SuperAstia
- Huom. superastian määrän lisääntyminen
- luokka/kielipohdintaa..
- Oliosuunnittelu
- Bergin & Winder: Understanding Object Oriented Programming
- [ http://csis.pace.edu/~bergin/patterns/ppoop.html ]
- kuvataan luokan kehitystä 'hacker solutionista' design patternilla tehtyyn
- myös esimerkki refaktoroinnista (parannetaan/yleistetään ohjelman sisäistä rakennetta - tosin tässä esimerkissä monimutkaisuus kasvaa ehkä liikaakin)
- kurssin taso: "naive OO-solution" on riittävä tavoite
- CRC-kortit
- Huom. 'relaatiomalli' ei ole ainoa vaihtoehto (ks. jäsenrekisterin runko)
- Vielä perinnästä... :-)
- circle is not ellipse -esimerkki
- [ http://www.parashift.com/c++-faq-lite/proper-inheritance.html#faq-21.6 ]
- lyhyesti: pelkästään yliluokan ominaisuuksien rajoittaminen ei ole syy periä uutta luokkaa
- rajapintojen käyttäminen johtaa laajassa luokkahierarkiassa helposti malliin, jossa lähes kaikki luokat toteuttavat useita rajapintoja - tällöin ongelma muuttuu luokkien suunnittelusta rajapintojen suunnitteluksi
- Jäsenrekisterin runko
- Valmistautumista vaihe 5:een
- Huom. vaihe 5 on perinteisesti ollut kaikkein työläin harjoitustyön tekovaihe. Koodaus on siis syytä aloittaa ajoissa!
- Toisaalta: kun vaihe 5 on kunnolla tehty, harjoitustyön valmistumisen todennäköisyys kasvaa huomattavasti...
- Mahdollisia tietorakenteita
- Taulukko (javassa vain 'osoitintaulukko')
- Javan valmiit tietorakenteet (Java 1.5:ssä myös geneerisinä, mutta sivuutetaan tässä vaiheessa kurssia)
- Linkitetty lista
- Sekarakenne
- Muita: hajautustaulu, (binääri)puu, tieto-olioiden sisäiset tietorakenteet ('verkko')...
- ks. harrastukset relaation avulla (omaa vaihe 4:ää varten huom. vsd-versio malliharjoitustyössä)
- Kerho, vaihe 4