Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän johdetun luokan käyttöön. Kantaluokan jäsenen näkyvyys määritellään tyypillisesti joko private -, protected - tai public -saantimääreellä. Käsitellään varatut sanat final ja abstract erikseen tämän kappaleen lopussa. Muodostetaan taulukko, josta käy ilmi näkyvyyssäännön vaikutus, kuva 1.
Johdetun luokan määrittely tMyn2 kantaluokka jäsenen näkyvyyssääntö: public jäsenet protected jäsenet private jäsenet näkyvyys johdetussa luokassa: johdettu luokka public protected periytyy, mutta ei ole käytettävissä Kuva 1. Näkyvyyssäännön vaikutus.
Johdetun luokan määrittely tMyn3 Perintä (inheritance) kantaluokasta määritellään varatulla sanalla extends, jossa kantaluokan ominaisuudet ja metodit peritään johdettuun luokkaan. Johdetun luokan muodostinta toteutettaessa on muistettava, että sen rungossa pitää ensimmäiseksi kutsua kantaluokan muodostinta, jotta kaikki perityt tietojäsenet saavat halutun/vaaditun alustuksen. Kantaluokan muodostimen kutsumisessa johdetun luokan muodostimesta käytetään varattua sanaa parent ja näkyvyysoperaattoria :: (scope resolution operator).
Johdetun luokan määrittely tMyn4 Kuvasta 1 nähdään, että kantaluokan private - saantimääreellä esitelty jäsen pysyy private - tyyppisenä kantaluokalle. Käytännössä tämä tarkoittaa sitä, että private -tyyppiset kantaluokan jäsenet ovat private -tyyppisiä myös johdetulle luokalle. Tästä seuraa, että kantaluokan private - tyyppiset tietojäsenet eivät ole käytettävissä johdetun luokan jäsenfunktioille. Niitä voi siis käyttää ainoastaan määrittelemällä kantaluokkaan public - saantimääreellä jäsenfunktio. Tarkastellaan näitä asioita seuraavassa esimerkissä:
Johdetun luokan määrittely tMyn5
Johdetun luokan määrittely tMyn6
Johdetun luokan määrittely tMyn7
Johdetun luokan määrittely tMyn8
Johdetun luokan määrittely tMyn9 Sitä vastoin jos kantaluokassa on public -tyyppinen jäsenfunktio, niin sitä voidaan käyttää johdetussa luokassa (esimerkiksi) kaiuttamaan näytölle kantaluokalta perityt private -tyyppiset tietojäsenet. Muilta osin kaikki on saman tyyppisesti kuin mitä edellisessä esimerkissä:
Johdetun luokan määrittely tMyn10
Johdetun luokan määrittely tMyn11
Johdetun luokan määrittely tMyn12
Johdetun luokan määrittely tMyn13
Johdetun luokan määrittely tMyn14 Jos kantaluokan jäsenen saantimääreenä on public tai protected, niin silloin johdetulle luokalle periytetty tietojäsen on myös tämän johdetun luokan jäsenfunktion käytettävissä. Tiedon piilottamisen periaatteen mukaisesti kantaluokan tietojäsenten ei tulisi koskaan olla public -tyyppisiä. Tehdään alkuperäiseen esimerkkiin se muutos, että asetetaan kantaluokan tietojäsenet protected - tyyppiseksi, muuten koodi on sama kuin ensimmäisessä esimerkissä:
Johdetun luokan määrittely tMyn15
Johdetun luokan määrittely tMyn16
Johdetun luokan määrittely tMyn17
Johdetun luokan määrittely tMyn18
Johdetun luokan määrittely tMyn19 Nyt kun kantaluokan tietojäsenet ovat protected - tyyppisiä, voidaan tehdä seuraava muutos: korvataan (redefinition) kantaluokan jäsenfunktio sopivammalla toteutuksella johdetussa luokassa, siis sekä kantaluokassa että johdetussa luokassa on otsikkotiedoiltaan identtinen jäsenfunktio:
Johdetun luokan määrittely tMyn20
Johdetun luokan määrittely tMyn21
Johdetun luokan määrittely tMyn22
Johdetun luokan määrittely tMyn23
Johdetun luokan määrittely tMyn24 Korvaamisessa (redefining) on se vaatimus, että johdetun luokan kohdalla korvattavan funktion otsikkotiedot on oltava täsmälleen samat kuin kantaluokassa. Siis kun kantaluokassa jäsenfunktion saantimääreenä on public, niin sen pitää olla public myös johdetussa luokassa (jossa sen toteutus on tarkoitus korvata). Tehdään edelliseen esimerkkiin vain tämä saantimääremuutos johdettuun luokkaan:
Johdetun luokan määrittely tMyn25
Johdetun luokan määrittely tMyn26
Johdetun luokan määrittely tMyn27
Johdetun luokan määrittely tMyn28 Leikitellään vielä hetki saantimääreellä protected. Jos kantaluokan jäsenfunktion saantimääreenä on protected, niin se tarkoittaa sitä, että sitä voi kutsua saman luokan toinen jäsenfunktio tai johdetun luokan jäsenfunktio – eivät ketkään muut. Sitä ei siis voi kutsua luokan ulkopuolelta. Siinä mielessä varattu sana protected on yhtä vahva kuin varattu sana private :
Johdetun luokan määrittely tMyn29
Johdetun luokan määrittely tMyn30
Johdetun luokan määrittely tMyn31
Johdetun luokan määrittely tMyn32
Johdetun luokan määrittely tMyn33 Mutta voihan sitä kutsua toinen jäsenfunktio, seuraavassa esimerkissä johdetun luokan jäsenfunktio – käytetään täsmälleen äskeistä esimerkkiä kommentoimalla kaksi riviä. Viittaaminen kantaluokan jäsenfunktioon onnistuisi myös käyttämällä varattua sanaa parent::, mutta nyt käytetään kantaluokan nimeä:
Johdetun luokan määrittely tMyn34
Johdetun luokan määrittely tMyn35
Johdetun luokan määrittely tMyn36 Harvemmin (?) käytetty saantimääre on final. Tämä saantimääre jäsenfunktion kohdalla tarkoittaa sitä, että kyseistä jäsenfunktiota ei voida korvata (override) johdetussa luokassa:
Johdetun luokan määrittely tMyn37
Johdetun luokan määrittely tMyn38
Johdetun luokan määrittely tMyn39
Johdetun luokan määrittely tMyn40
Johdetun luokan määrittely tMyn41 Jos käyttäisi final -saantimäärettä luokan kohdalla, niin se tarkoittaisi sitä, että kyseistä luokkaa ei pystyisi periyttämään. Pidetään siis edellinen esimerkki muuten täsmälleen samana, mutta siirretään varattu sana final luokan Henkilo kohdalle:
Johdetun luokan määrittely tMyn42
Johdetun luokan määrittely tMyn43
Johdetun luokan määrittely tMyn44 Joskus ohjelmoija voi olla sitä mieltä, että johonkin luokkaan ei saa luoda (instantioida) lainkaan olioita. Tällaista toimintaa varten on olemassa varattu sana abstract. Tehdään esimerkki, jossa kantaluokka määritellään abstract -tyyppiseksi. Jos luokka on abstract -tyyppinen ja sillä on tietojäseniä, niin silloin ilman muuta pitää toteuttaa tähän kyseiseen abstraktiin luokkaan muodostin, jotta toiminta on oikeellista siinä vaiheessa kun tästä abstraktista kantaluokasta johdettuun luokkaan luodaan olio.
Johdetun luokan määrittely tMyn45 Edelleen on myös mahdollista toteuttaa abstraktiin luokkaan jäsenfunktioita, vaikka eipä siinä taida olla paljoakaan järkeä: eihän kyseiseen luokkaan voi luoda olioita, joten kukapa näitä abstraktin luokan jäsenfunktioiden toteutuksia tarvitsisi!:
Johdetun luokan määrittely tMyn46
Johdetun luokan määrittely tMyn47
Johdetun luokan määrittely tMyn48
Johdetun luokan määrittely tMyn49
Johdetun luokan määrittely tMyn50 Edellinen esimerkki alkaa toimimaan, kun kommentoidaan ne rivit, joissa yritetään luoda kantaluokkaan olio:
Johdetun luokan määrittely tMyn51
Johdetun luokan määrittely tMyn52
Johdetun luokan määrittely tMyn53 Jos halutaan luoda abstrakti luokka, niin silloin lienee luontevinta, että samaisen luokan tavalliset jäsenfunktiot ovat myöskin abstrakteja – jos ylipäänsä haluaa sisällyttää kyseiseen luokkaan muita jäsenfunktioita kuin mahdollisesti muodostin (koska niitä tietojäseniä varmaankin on tyypillisesti abstraktillakin luokalla). Toisin päin on näin: jos sisällyttää luokkaan abstraktin jäsenfunktion, niin sitten on pakko nimetä myös kyseinen luokka abstraktiksi. Huom! Abstrakti jäsenfunktio ei saa sisältää runkoa, ei edes aaltosulkeita rungon kohdalla:
Johdetun luokan määrittely tMyn54
Johdetun luokan määrittely tMyn55
Johdetun luokan määrittely tMyn56
Johdetun luokan määrittely tMyn57 Muutetaan edellinen esimerkki toimimaan: abstraktilla kantaluokalla on yksi abstrakti jäsenfunktio. Tehdään tälle abstraktille jäsenfunktiolle kelvollinen toteutus johdetussa luokassa:
Johdetun luokan määrittely tMyn58
Johdetun luokan määrittely tMyn59
Johdetun luokan määrittely tMyn60