90 likes | 232 Views
10. Abstrakti luokka. Johdanto. Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei voi luoda olioita – abstraktia luokkaa käytetään olioiden asemasta periytymisen avulla. Luokalle voidaan kuitenkin kirjoittaa rakentajia.
E N D
Johdanto • Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei voi luoda olioita – abstraktia luokkaa käytetään olioiden asemasta periytymisen avulla. • Luokalle voidaan kuitenkin kirjoittaa rakentajia. • Abstraktin luokan aliluokka voi olla abstrakti. • Abstrakti luokka ei tyypillisesti toteuta kaikkia metodejaan: osalle metodeista (abstraktit) annetaan vain otsikot ja runkojen määrittely (toteutus) jätetään luokan jälkeläisille. • Abstraktissa luokassa ei ole pakko olla abstrakteja metodeja.
Johdanto • Koska yksikin abstrakti metodi tekee luokasta abstraktin, konkreettisen aliluokan on toteutettava kaikki perimänsä abstraktit metodit. • Abstrakti luokka soveltuu luontevasti abstraktien käsitteiden (esim. läheisyys, päivämäärä ja nisäkäs) kuvaamiseen. • Abstrakti luokka mahdollistaa ohjelmointitekniikan, jolla varmistetaan, että abstraktin yliluokan konkreettisen aliluokan liittymässä on aina joukko metodeja, joita aliluokan on ollut pakko “tarkentaa” nämä metodit toteuttamalla. • Konkreettisen luokan aliluokan ei ole pakko korvata perittyjä metodeja.
Abstraktin luokan määrittely • Javassa varattua sanaa abstract käyttäen. • Yleisesti: määreet abstract class LuokanNimi { ... } missä määreet-kohta on valinnainen. • Määritellään jatkossa julkisiksi public-määreen avulla. • Jälkeläisten toteuttamiksi tarkoitetut metodit annetaan abstract-määreellä ilman runkoa. • Toteutetun metodin otsikosta abstract-määre jätetään luonnollisesti pois.
Eläin elossa, paino syö(), onkoIso() Kissa Nisäkäs väri, häntä ääntele(), kehrää() turkillinen syö(), onkoIso() Eläin, nisäkäs ja kissa Piirteet: elossa, paino, syö(), onkoIso() Nisakas toteuttaa perimänsä metodit. Piirteet: elossa, paino, syö(), onkoIso(), turkillinen Piirteet: elossa, paino, syö(), onkoIso(), turkillinen, väri, häntä, ääntele(), kehrää() UML:ssä abstraktius ilmaistaan usein kursivoimalla.
Eläin, nisäkäs ja kissa (Elain.java) // Yksinkertainen abstrakti Elain-luokka. public abstract class Elain { private boolean elossa; private double paino; // Rakentajat ja aksessorit. ... // Abstraktit oliometodit. public abstract void syo(); public abstract boolean onkoIso(); }
Eläin, nisäkäs ja kissa (Nisakas.java) // Elain-luokasta peritty abstrakti Nisakas-luokka. public abstract class Nisakas extends Elain { private boolean turkillinen; // Rakentajat ja aksessorit. ... // Toteutetut metodit. public void syo() { System.out.println("Syön kuin nisäkäs..."); } public boolean onkoIso() { return false; } }
Eläin, nisäkäs ja kissa (Kissa.java) // Nisakas-luokasta peritty konkreettinen Kissa-luokka. public class Kissa extendsNisakas { private String vari; private String hanta; // Rakentajat, aksessorit ja muut oliometodit. ... // Korvatut metodit. public void syo() { System.out.println("Syön kuin kissa..."); kehraa(); } public boolean onkoIso() { return paino() > 10; } }
Eläin, nisäkäs ja kissa (Testi.java) public class Testi { public static void main(String[] args) { // Tämä ei menisi kääntäjästä läpi, // koska abstraktista luokasta ei voida luoda olioita. // Nisakas nisse = new Nisakas(); Kissa mussu = new Kissa(); mussu.syo(); // Syön kuin kissa... } // murr, murrrr... }