- COMP.CS.140
- 6. Luokkahierarkiat
- 6.1 Modulaarisuus: Rajapinnat
- 6.1.1 Abstrakti kantaluokka
Abstrakti kantaluokka¶
Abstraktien kantaluokkien (engl. abstract base class) roolina on auttaa ryhmittelemään todellisia luokkia yhteisen käyttäytymisen tai toteutuksen perusteella. Kantaluokan tehtävänä on paljastaa aliluokille yhteinen hierarkkinen rajapinta ja vastaavasti kätkeä näiden rajapintafunktioiden toteutus aliluokkiin eli konkreettisiin luokkiin niiden toiminnallisuutta vastaavalla tavalla. Kaikilla abstraktin kantaluokan perillisillä on yhteinen rajapinta ja siten sama käyttäytyminen, jolloin niitä voidaan ohjelmassa kutsua yhteisellä nimellä. Abstrakti kantaluokka voi myös toteuttaa perillisilleen yhteisen toiminnallisuuden jo kantaluokan tasolla. Kantaluokka on abstrakti, jos yksikin rajapinnan palvelu on abstrakti eli jätetään kantaluokan tasolla toteuttamatta. Koska abstraktilla kantaluokalla ei ole rajapinnalle täyttä toteutusta, siitä ei voi luoda ohjelmassa olioita. Se onkin tarkoitettu käytettäväksi vain kantaluokkana. Abstraktin kantaluokan rajapinnassa voi siis olla:
abstrakteja rajapintafunktioita, jotka konkreettiset luokat toteuttavat täysin
rajapintafunktioita, joissa on funktion tarjoamasta palvelusta aliluokille yhteinen osa toteutuksesta
täyden toiminnallisuuden sisältäviä rajapintafunktioita
Kantaluokka on abstrakti kunnes kaikki abstraktit rajapinnan palvelut on toteutettu.
![kuva, jossa luokkahierarkia eliöstöstä](https://plus.tuni.fi/graderS/static/compcs140-f2022/_images/luokkahierarkia1.png)
Eliöstön luokkahierarkia, jossa abstrakteja kantaluokkia¶
Tarkastellaan yllä olevaa luokkahierarkiaa nyt abstraktien kantaluokkien näkökulmasta. Eliö (Organism) on kaikkia ohjelman eliöitä kuvaava kantaluokka. Se määrittelee, että kaikki ohjelman eliöt lisääntyvät (reproduce) tietyllä, ulospäin yhteneväiseltä näyttävällä tavalla. Eliö ei kuitenkaan ota kantaa siihen, miten lisääntyminen toteutetaan. Koska olioita voi käsitellä kantaluokkansa olioina, jokaista eliötä voi näin käskeä ohjelmassa lisääntymään tietämättä tarkemmin, minkä eliön olio on kyseessä. Ihminen (Human) ja kana (Hen) lisääntyvät kuitenkin hyvin eri tavoilla. Tästä johtuen lisääntyminen on määritelty eliöille abstraktina: lisääntyminen toteutetaan konkreettisissa luokissa niille sopivalla tavalla. Vastaavasti hierarkian seuraavalla tasolla abstrakti kantaluokka Lintu (Bird) määrittelee linnuille yhteisesti kaksi ominaisuutta: munimisen (layEgg) sekä laulaminen (sing). Laulaminen on linnulle abstrakti eli jokainen lintu määrittää sen omaäänisekseen. Munimiselle annetaan jo kantaluokan tasolla toteutus. Periytymisen avulla linnut voivat toki muokata munimisenkin toiminnallisuutta, mutta kaikille yhteinen toteutus tehdään kantaluokan tasolla.
Kiinnitetään luokkahierarkiassa huomiota sekä lintujen munimiseen, että kaikille eläimille (Animal) yhteiseen abstraktiin palveluun: liikkumiseen. Vaikka vesinokkaeläin (Platypus) on nisäkäs, se lisääntyy munimalla munia, joita se hautoo pesässään. Tämähän on lintujen kanssa yhteistä toiminnallisuutta. Vesinokkaeläintä ei kuitenkaan voida hierarkiassa siirtää linnuksi, koska se ei muilta osin täytä linnuille yhteistä toiminnallisuutta. Toinen vastaava hankaluus löytyy sienistä (Fungus): limasieni (SlimeMold) on siitä erikoinen eliö, että se osaa myös liikkua ja hierarkiamme määritelee liikkumisen eläimille yhteiseksi puuhaksi. (Limasieni toimii tässä myös esimerkkinä siitä, miten vaikeaa kategorisointi ylipäätään on ja miten luokkahierarkia ei aina vastaa yksi yhteen konkreettista maailmaa, jota se mallintaa: limasieni ei ole oikeasti sieni, jollaiseksi se on ennen laskettu. Se ei kuitenkaan ole myöskään eläin, joten esimerkin vuoksi, tällä mennään.) Tällaisiin tilanteisiin, joissa yhden hiearkian alle ei saada kaikkea toiminnallisuutta ryhmiteltyä, ratkaisu löytyy rajapintaluokista.
Abstraktit kantaluokat (kesto 12:32)