Hallo!
Mikä tarkoitus Javassa on abstrakteilla luokilla? Mitä kirjasta lukiessa käsitin, niin se on vain luokka jossa määritellään metodeja joissa ei ole toiminnallisuutta. Sitten se luokka peritään, ja perijäluokassa tarvitsee joka tapauksessa määritellä ne metodit, jotka ovat esitelty abstraktissa yläluokassa?
Ihmettelin vaan, että mikä idea on periä luokka joka ei tee mitään.
Abstraktia luokkaa itseään ei ole tarkoitus käyttää. Siinä voidaan määritellä abstrakteja ja normaaleja funktioita. Kun sitten jokin luokka periytetään tuosta abstraktista luokasta, niin sen täytyy ratkaista miten se abstrakti funktio toteutetaan ko. perityn luokan kannalta mielekkäästi.
Sinänsähän tuon saisi aikaan myös interfacella, mutta interfacessa ei voi toteuttaa mitään funktioita.
Eli voisi tavallaan ajatella, että abstrakti luokka on tavallisen luokan ja interfacen yhdistelmä.
Abstraktit luokat ovat yleiskäyttöisiä luokkia. Jos kaksi ohjelmaa tarvisee samanlaisen luokan, joissa on joitain yhteisiä osia mutta ei kaikkia, niin on kätevää luoda yleinen abstrakti luokka, josta luodaan aliluokkia, joiden sovelluskohtaiset metodit koodataan itse.
Jaska kirjoitti:
Abstraktit luokat ovat yleiskäyttöisiä luokkia. Jos kaksi ohjelmaa tarvisee samanlaisen luokan, joissa on joitain yhteisiä osia mutta ei kaikkia, niin on kätevää luoda yleinen abstrakti luokka, josta luodaan aliluokkia, joiden sovelluskohtaiset metodit koodataan itse.
En näe mitään tarvetta puhua "erillisistä ohjelmista" tässä yhteydessä - se ei varsinaisesti edes liity käsiteltävään aiheeseen. Yksinkertaistettuna, jos luokkahierarkiassa jokin yliluokka ei voi toimia (järkevästi) itsenäisenä, tehdään tästä luokasta abstrakti. Esimerkki tilanteesta olisi se, että aliluokat toteuttavat kaikki jonkin funktion, mutta yliluokassa funktion toteutukselle ei ole mitään mielekästä tapaa; funktiota ei toisaalta voi jättää toteuttamattakaan, ellei luokkkaa määritetä abstraktiksi.
Itse olen kokenut tämän OO-suunnittelussa sellaiseksi, että jätetään luokka/metodi abstract ja sitä kautta pakotetaan perivä luokka jollain tapaa toteuttamaan sen.
Tutustu käsitteeseen polymorfismi ja koukku-metodi, niin tiedät miksi abstraktit-luokat ovat erinomainen keksintö.
Edit. _Pete_: Sitä varten on rajapinnat erikseen ja kaiken kaikkiaan en lähtisi liikaa pitämään rajapintoja ja abstrakteja-luokkia vertaisinaan, sillä niillä molemmilla on kuitenkin omat käyttötarkoituksensa...
Toni: Enpä ole mistään koukkumetodista ennen kuullutkaan, ja netistä näytti löytyvän tuolla hakusanalla ainoastaan Arto Wiklan oppimateriaalia. Onkohan järkevää käyttää tuollaista vakiintumatonta termiä, kun voi ihan hyvin puhua abstrakteista metodeista ja tulla paremmin ymmärretyksi?
Kapteeni Jaakko Koukku, eli Captain James Hook.
Metabolix: Wiklan luennolta tuo termi olikin peräisin. :D Tosin kun etsiskelin googlella termiä "hook method", niin kyllä sillä ainakin löytyi keskusteluja...
Eli niille joille jäi epäselväksi, niin tuon tuntemattoman termini (tai Wiklan termin) idea on kaikessa yksinkertaisuudessaan seuraava:
public abstract class TervehdysAbstrakti { public abstract String annaNimi(); public void tervehdi() { System.out.println("Moi, " + this.annaNimi() + "!"); } } public class Tervehdys extends TervehdysAbstrakti { public String annaNimi() { return "Pikku-Kalle"; } public static void main(String[] args) { this.tervehdi(); } }
Se, kuinka hyvin "koukkumetodi" kuvaa koko hommaa on oma juttunsa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.