Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E. Hyvönen: Java Osa 7 2 Abstraktin luokan idea Abstrakti luokka ja metodi Abstrakteja luokkia käytetään tilanteissa, jossa yliluokan aliluokille pitäisi periyttää yhteinen metodi, mutta ko. metodia ei ole mielekäs määritellä itse yliluokalle. 13.10.2000 E. Hyvönen: Java Osa 7 4 Esimerkki class Kuvio { void draw() { // Periytettävä ominaisuus, // mutta yleistä kuviota ei voi piirtää! class Ympyra extends Kuvio { void draw() { class Nelio extends Kuvio { void draw() { Määrittelemällä yliluokka ja metodi abstrakteiksi, voidaan aliluokille esittää vaatimus ko. metodin luokkakohtaisesta määrittelystä. Kääntäjä tarkistaa, että kaikki perityt abstraktit metodit todella määritellään aliluokissa. Kuvion draw()-metodi voitaisiin määritellä tyhjänä tms. ja korvattaisiin se aliluokissa, mutta se olisi eleganttia. 13.10.2000 E. Hyvönen: Java Osa 7 5 13.10.2000 E. Hyvönen: Java Osa 7 6 1
Esimerkki Abstraktissa luokassa on Yleensä yksi tai useampia abstrakteja metodeja Näiden toteutus täytyy löytyä aliluokista. Mahdollisesti muita ei-abstrakteja metodeja ja muuttujia. Nämä periytyvät normaaliin tapaan. Abstrakti luokka ja metodi ilmaistaan etumääreellä abstract 13.10.2000 E. Hyvönen: Java Osa 7 7 abstract class Kuvio { int x =0; int y=0; abstract void draw(); // Toteutusvaatimus aliluokille String tostring() { // Tavall. ei-abstrakti metodi class Ympyra extends Kuvio {... void draw() {// Abstraktin metodin toteutus... 13.10.2000 E. Hyvönen: Java Osa 7 8 Esimerkki Tiedosto -luokalla on aliluokkina TekstiTiedosto KuvaTiedosto jne. Tulostusmetodi print() ei ole mielekäs yleiselle Tiedosto-luokalle mutta on tarpeen erikseen jokaiselle aliluokalle. 13.10.2000 E. Hyvönen: Java Osa 7 9 Määritellään abstract class Tiedosto { // Luokka on abstrakti, jos sillä on yksikin abstrakti metodi int koko() {; // Voi olla tavallisia metodeja ja muuttujia. abstract void tulosta(); // Määrittelyssä vain kutsun esittely, // ei runkoa! class TekstiTiedosto extends Tiedosto { // Aliluokalta edellytetään tulosta-metodin oma määrittely. void tulosta() {. 13.10.2000 E. Hyvönen: Java Osa 7 10 Abstraktin luokan ominaisuuksia Abstraktista luokasta ei voi luoda ilmentymiä. Abtraktia luokka on vaatimuskuvaus ilman toteutusta kaikilta osin. Muuten abstraktia luokkaa voi käyttää kuten muitakin luokkia. Abstrakti luokka on yleensä luokkahierarkian yläpäässä Käytetään esimerkiksi julkisen käyttöliittymän kuvauksena, joka toteutetaan aliluokilla. Abstrakti luokka voi olla hierarkiassa välitasollakin. 13.10.2000 E. Hyvönen: Java Osa 7 11 Abstraktissa luokassa voi olla kenttiä sekä abstrakteja että muita metodeja. Abstraktin luokan aliluokan ei tarvitse määritellä kaikkia perittyjä abstrakteja metodeja, mutta tällöin sen on itsekin oltava abstrakti. Lopulta jonkin tason ei-abstraktissa aliluokassa viimeinenkin abstrakti metodi tulee määritellyksi. 13.10.2000 E. Hyvönen: Java Osa 7 12 2
Abstrakti metodi: ominaisuuksia Abstraktilla metodilla ei voi olla static-määrettä static olettaa, että metodilla on toteutus. Abstraktilla metodilla ei voi olla final-määrettä Metodi on pakko uudelleenmääritellä aliluokissa. Rajapintamäärittely (interface) 13.10.2000 E. Hyvönen: Java Osa 7 13 Rajapinnan idea Määrittelyn muoto Rajapintamäärittely (interface) on kokoelma vakioita ja abstrakteja metodeja Liittämällä luokkaan vaatimus interfacemäärittelystä, voidaan luokkaan periyttää vakioita ja vaatimus abstraktien metodien toteuttamisesta. Rajapinta ei ole luokkamäärittely vaan apuväline luokkamäärittelyihin. 13.10.2000 E. Hyvönen: Java Osa 7 15 Syntaksi: interface nimi { vakioesittelyt abstraktit metodit Esimerkiksi: interface TiedostoSuojaus { int EXECUTE = 2; int READ=4; int WRITE=6; void tulostasuojaus(int arvo); 13.10.2000 E. Hyvönen: Java Osa 7 16 Oletusmääreet Rajapintojen käyttö Rajapinnan vakioesittelyt oletaan järjestelmän puolesta annetuiksi määreillä public final Metodien esittelyt oletaan järjestelmän puolesta annetuiksi määreillä abstract public Muuten interface määrittely ei olisi kovin mielekäs. Rajapintavaatimus ilmaistaan muodolla "implements rajapinta" luokan nimen jälkeen class KuvaTiedosto implements Tulostuva { Luokka voi samalla olla myös aliluokka ja toteuttaa useita rajapintoja class Lehma extends Elain implements Kulkeva, Lypsava { 13.10.2000 E. Hyvönen: Java Osa 7 17 13.10.2000 E. Hyvönen: Java Osa 7 18 3
Rajapinta voi myös laajentaa toista rajapintaa interface Tulostuva { interface ErikoisTulostuva extends Tulostuva { Vakiot ja metodit periytyvät kuten luokkahierarkiassa. Rajapintaluokkia voi käyttää metodien muodollisten parametrien tyyppinä. Tällöin parametrin arvona voi olla minkä tahansa rajapinnan toteuttavan luokan tai sen aliluokan ilmentymä. Tärkeä kättötapa: Luokan toteuttaja tietää, mitkä metodit argumenteille on taatusti käytettävissä 13.10.2000 E. Hyvönen: Java Osa 7 19 Kun on sovittu rajapinnasta, esim. Tulostuva, voi ohjelmoija A toteuttaa vaikka luokkaan Puskuri metodeja kuten void tulosta (Tulostuva t) joissa voidaan käyttää Tulostuva -rajapinnan kutsuja ja vakiota, esim. tulostapäätteelle(). Ohjelmoija B taas voi toteuttaa yksikseen Tulostuva -rajapinnan toteuttavia luokkia, kuten TekstiTiedosto. Vastaavia olioita voidaan surutta antaa esim. A:n Puskuri-luokan tulosta-metodille argumenttina! 13.10.2000 E. Hyvönen: Java Osa 7 20 Moniperintä Javassa Luokka voi toteuttaa useampiakin rajapintoja. Mutta periä luokkahierarkiassa vain yhdeltä vanhemmalta! Rajapinnoinnoilla voidaan siis laajentaa Javan periytymismekanimia moniperinnän (multiple inheritance) suuntaan. Moniperintä rajapintahierarkian/oiden kautta Ilmentymä luodaan luokkahierarkian perusteella Tarpeen yhdistelmäkäsitteissä Esimerkiksi Muulilla on toisaalta Aasi-ominaisuuksia, toisaalta Hevonen-ominaisuuksia. 13.10.2000 E. Hyvönen: Java Osa 7 21 Rajapinta vs. abstrakti luokka Molemmilla periytetään metodien toteutusvaatimuksia. Rajapinnasta voi periytyä vain abstrakteja metodeja ja vakioita Abstraktista luokasta voi periytyä tämän lisäksi muuttujia ja tavallisia metodeja. Luokka voi periä monelta rajapinnalta mutta vain yhdeltä luokalta tai abstraktilta luokalta. 13.10.2000 E. Hyvönen: Java Osa 7 22 Tiedon kapselointi ja peittäminen Abstraktit luokat ja rajapinnat ovat tärkeä väline tiedon kapselointiin (encapsulation) ja peittämiseen (information hiding). Määrittelyt kertovat ainoastaan käyttöliittymän vaatimukset Ne voidaan antaa projektin alussa ilman toteutusta. Toteutustapa on piilotettu luokkamäärittelyjen sisäiseksi asiaksi. Sovelluskäyttäjän ei tarvitse tietää toteutustapaa. Mahdollistavat toteutustyön riippumattomina osina. 13.10.2000 E. Hyvönen: Java Osa 7 23 Tämä helpottaa monessa asiassa ohjelmistojen hallinta, osittaminen, siirrettävyys, uudelleen käyttö, dokumentointi, 13.10.2000 E. Hyvönen: Java Osa 7 24 4
Kertausta Lisätietoja Mikä ero on luokalla ja abstraktilla luokalla? Mikä ero on luokalla ja rajapinnalla? Mikä ero on abstraktilla luokalla ja rajapinnalla? Mihin abstraktia luokkaa käytetään? Mihin rajapintaa käytetään? Arto Wikla: Ohjelmoinnin perusteet Java-kielellä, OtaDATA, 1998. John Lewis, William Loftus: Java Software Solutions, Addison-Wesley, 1998. 13.10.2000 E. Hyvönen: Java Osa 7 25 13.10.2000 E. Hyvönen: Java Osa 7 26 5