Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

9.3.4 Perintä

Viimeisenä vaihtoehtona tarkastelemme perintää ( inheritance). Valinta koostamisen ja perinnän välillä on vaikea. Aina edes olioasiantuntijat eivät osaa sanoa yleispätevästi kumpiko on parempi. Nyrkkisääntönä voisi pitää seuraavaa is-a -sääntöä:

	Jos voi sanoa että lapsiluokka on (is-a) isäluokka, niin peritään.
	Jos sanotaan että lapsiluokassa on (has-a) isäluokka, niin koostetaan

Kokeillaanpa: " luokka jossa on aika sekunteina " on " aika-luokka". Kuulostaa hyvältä. Siis perimään:

olioalk\AikaSek8.java - laajentaminen perimällä

	/**
	 * Luokan laajentaminen perimällä
	 * @author  Vesa Lappalainen
	 * @version 1.0, 01.02.2003
	 */
	public class AikaSek8 extends Aika5 { // perii kaikki luokan Aika5 ominaisuudet
	
	  private int s = 0;
	
	  /**
	   * Asettaa uuden ajan ja pitää huolen että aika on aina oikeaa muotoa.
	   * @param h asetettavat tunnit
	   * @param m asetettavat minuutit
	   * @param s asetettavat sekunnit
	   */
	  public void aseta(int h,int m, int s) {
	    this.s = s;  super.aseta(h,m); lisaa(0,0);
	  }
	
	  public AikaSek8() { }
	
	  /**
	   * Alustaa ajan
	   * @param h tunnit
	   * @param m minuutit
	   * @param s sekunnit
	   */
	  public AikaSek8(int h,int m, int s) { // Muodostaja
	    aseta(h,m,s);
	  }
	
	  public AikaSek8(int h,int m) { aseta(h,m,0); }
	  public AikaSek8(int h)       { aseta(h,0,0); }
	
	  /**
	   * Tulostaa ajan muodossa 15:05
	   * @param lf tulostetaanko rivinvaihto vai ei
	   */
	  public void tulosta(boolean lf) {
	    super.tulosta(false);
	    System.out.print(":" + (s<10?"0":"")+s);
	    if ( lf ) System.out.println();
	  }
	
	  /**
	   * Lisää aikaan valitun minuuttimäärän
	   * @param lisa_min lisättävä minuuttimäärä
	   * @param lisa_sek lisättävä sekunttimäärä
	   */
	  public void lisaa(int lisa_min,int lisa_sek)  {
	    s += lisa_sek;
	    super.lisaa(lisa_min+s/60);
	    s %= 60;
	  }
	
	  public static void main(String[] args) {
	    Aika5 a1 = new Aika5();
	    Aika5 a2 = new Aika5(13);
	    Aika5 a3 = new Aika5(14,175);
	
	    a1.tulosta();  a2.tulosta();  a3.tulosta();
	    a1.aseta(12,15); a2.aseta(16,-15);
	    a1.tulosta(); a2.tulosta();
	
	    AikaSek8 a4 = new AikaSek8(14,55,45); a4.tulosta();
	    a4.lisaa(3,30); a4.tulosta();
	    AikaSek8 a5 = new AikaSek8();         a5.tulosta();
	    AikaSek8 a6 = new AikaSek8(12);       a6.tulosta();
	    AikaSek8 a7 = new AikaSek8(12,15);    a7.tulosta();
	  }
	
	}

Tässä tapauksessa kirjoittamisen vaiva oli melkein sama kuin koostamisessakin. Niitä aseta, lisaa ja tulosta metodeja, jotka löytyivät jo kantaluokasta Aika5 ei tarvinnut kirjoittaa. Kuitenkin esimerkiksi kaikki eri versiot muodostajasta pitää kirjoittaa, sillä muodostaja ei periydy Javassa.

Joissakin tapauksissa perimällä pääsee todella vähällä. Otamme tästä myöhemmin esimerkkejä, kunhan pääsemme eroon syntaksin esittelystä.

Lapsiluokka, aliluokka ( child class, subclass) on se joka perii (Javassa extands) ja isäluokka, yliluokka ( parent class, super) se joka peritään. Käytetään myös nimitystä välitön ali/yliluokka, kun on kyseessä perintä suoraan luokalta toiselle, kuten meidän esimerkissämme.

Javassa välitön yliluokka ilmoitetaan aliluokan esittelyssä:

	public class AikaSek8 extends Aika5 { 

Jos täytyy viitata yliluokan metodeihin, joille on kirjoitettu aliluokassa oma määrittely, käytetään yliluokan viitettä super

	    super.lisaa(lisa_min+s/60);

Yliluokan viitettä ei tarvita, mikäli samannimistä metodia ei ole aliluokassa.

Perintää kuvataan piirroksessa:


Kuva 9.2 Aika perinnällä


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys