Abstrakti luokka

**Abstrakti luokka** on olio-ohjelmoinnissa käytetty luokka, josta ei voi luoda oliota. Se mahdollistaa rakennuspohjan luomisen, josta voidaan periä muuttujia ja metodeja muille luokille. Tällä vähennetään koodin toistuvuutta ja helpotetaan muokkaamista, koska muutokset voidaan tehdä abstraktiin luokkaan ja ne ilmestyvät kaikkiin sen periviin luokkiin. Koodia on myös helpompi lukea jos abstrakteja luokkia on hyödynnetty tehokkaasti, sillä se selventää eri luokkien suhteita toisiinsa. Abstraktit luokat itsessään ei tee mitään, vaan niitä hyödynnetään ainoastaan abstraktin luokan perivissä luokissa.

Abstraktit luokat sisältävät yleensä abstrakteja metodeja, jotka eivät sisällä toteutusta, mutta määrittelevät metodin nimen, paluuarvon ja mahdolliset parametrit. Kaikki abstraktit metodit on erikseen toteutettava jokaiseen abstraktin luokan periviin luokkiin ennen kuin niistä voidaan luoda olioita. Konkreettisia metodeja, jotka ovat periytynyt abstraktista luokasta, ei tarvitse erikseen toteuttaa luokassa. 

Java-ohjelmointikielessä abstrakti luokka luodaan nimikkeellä *abstract*, ja sen sisällä voi olla sekä abstrakteja että konkreettisia metodeja. C++ ohjelmointikielessä taas abstraktin luokan määritelmä on luokka, jonka sisällä on vähintään yksi abstrakti metodi.

Konkreettiset luokat ovat abstraktin luokan vastakohta, ja konkreettisesta luokasta voidaan luoda olio toisin kuin abstraktista luokasta. Abstraktissa luokassa voi olla sekä abstrakteja että konkreettisia metodeja, kun taas konkreettisessa luokassa voi olla vain konkreettisia metodeja.

### Rajapintaluokka Javassa
Rajapintaluokka (interface) on kokoelma abstrakteja metodeja, joka tarjoaa määrittelyjä, muttei toteutuksia sitä implementoiville (implements) luokille. Määrittelyt ovat oletuksena abstrakteja metodeja, joten “abstract” avainsanaa, ei tarvita määriteltäessä rajapinnan metodia. Määriteltävä metodi tarvitsee ainoastaan nimen, paluutyypin ja mahdolliset parametrit. Java 8 versiosta eteenpäin rajapinnat voivat myös määritellä staattisia vakioarvoja (final static), joita voidaan hyödyntää rajapintaa implementoivien luokkien vakioarvoina, sekä oletus (default) metodeja, jotka voivat sisältää varsinaisen toteutuksen. Toisin sanoen rajapinta kertoo luokille mitä niiden tulee tehdä, muttei kuinka niiden tulisi totetuttaa kyseiset metodit.

Rajapinnan hyödyt ja erot abstraktiin luokkaan piilee siinä, kuinka toisiinsa kuulumattomat luokat voivat implementoida samaa rajapintaa tai useita eri rajapintoja ja näiden metodeja, joka mahdollistaa moniperinnän, joka taas muutoin Javassa ei ole mahdollista. Tämä helpottaa koodin rakenteen yksinkertaistamisessa, koska samoja metodeja ei tarvitse määritellä eri kantaluokista periytyvissä luokissa erikseen. Rajapinnat voivat myös laajentaa (extends) toisia rajapintoja. Esimerkiksi ohjelmassa on kaksi rajapintaa, jotka sisältävät omat metodinsa ja näitä kahta rajapintaa laajentava alarajapinta (subinterface) perii molempien laajennettavien rajapintojen metodit, jotka taas voidaan välittää alarajapintaa implemetoivalle luokalle. Lähtökohtaisesti rajapintojen kaikki metodit ovat abstrakteja, joita implementoivat luokat voivat polyformismin ansiosta ylikirjoittaa (@Override) niistä omaan tarkoitukseensa sopivia.

## Lähteet