Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

9.3.7 Yliluokan muodostajan kutsuminen ennen muodostajaa

Joskus kirjoittamalla vähän enemmän voi saada aikaan nopeampaa ja turvallisempaa koodia. Niin tässäkin tapauksessa. Nimittäin säätäminen siinä, ettemme vaivautuneet kirjoittamaan muodostajia hirveän huolella, johtaa siihen että esimerkiksi alustus

	AikaSek8 a4 = new AikaSek8(14,55,45);

kutsuu kaikkiaan seuraavia metodeja:

	AikaSek8(14,55,45);
	  Aika5();                // koska oli Aika5 pitää alustaa aluksi
	    Aika5.aseta(0,0);
	       Aika5.lisaa(0);       // Tässä Aika5, koska ei vielä "kasvanut" AikaSek8
	  AikaSek8.aseta(14,55,45);
	    Aika5.aseta(14,55);
	      Aika5.lisaa(0);        //
	        Aika.lisaa(0,0);
	    AikaSek8.lisaa(0,0);
	      Aika5.lisaa(0,0);

Olisitko arvannut! Enää ei tarvitse ihmetellä miksi olio-ohjelmat ovat isoja ja hitaita. Totta kai voitaisiin sanoa, että hyvän kääntäjän olisi pitänyt huomata tuosta optimoida päällekkäisyydet pois. Mutta tämä on vielä tänä päivänä kova vaatimus kääntäjälle. Mutta ehkäpä voisimme ohjelmoijina vähän auttaa:

olioalk\AikaSekB.java - tarkemmmin mietityt muodostajat

	  public AikaSekB(int h,int m, int s) { // Muodostaja
	    super(h,m); this.s = s; lisaa(0,0);
	  }
	
	  public AikaSekB(int h,int m) { super(h,m); s = 0; }
	  public AikaSekB(int h)       { super(h);   s = 0; }
	  public AikaSekB()            { super();    s = 0; }

olioalk\AikaB.java - tarkemmmin mietityt muodostajat

	  public AikaB()            { this.h = 0; this.m = 0; }
	  public AikaB(int h)       { aseta(h,0);             }
	  public AikaB(int h,int m) { aseta(h,m);             }

Samalla on riisuttu pois alustukset

	  private int h=0, m=0;
	ja muutettu muotoon
	  private int h,m;

Nyt on saatu ainakin seuraavat edut: oletustapauksessa kumpikin luokka alustuu pelkillä 0:ien sijoituksilla, ilman yhtään ylimääräistä kutsua.

ELI! Perityn yliluokan muodostajaa kutsutaan automaattisesti, jollei sitä itse tehdä. Nyt parametrillisessa muodostajassa kutsutaan yliluokan muodostajaa, ja näin voidaan välttää ainakin oletusmuodostajan kutsu:

	public AikaSekB(int h,int m, int s) { super(h,m); this.s = s; lisaa(0,0);  }

Nyt alustuksesta

	AikaSekB a4 = new AikaSekB(14,55,45);

seuraa seuraavat metodikutsut

	AikaSekB(14,55,45);
	  AikaB(14,55);                // koska oli Aika5 pitää alustaa aluksi
	    AikaB.aseta(14,55);
	       AikaB.lisaa(0);       // Tässä AikaB, koska ei vielä "kasvanut" AikaSek8
	    AikaSekB.lisaa(0,0);
	       AikaB.lisaa(0,0);

Turhaahan tuossa on vieläkin, mutta tippuihan kuitenkin noin puolet pois! Joka tapauksessa periminen tuottaa jonkin verran koodia, aina kun yliluokan metodeja käytetään hyväksi. Ja jollei käytettäisi, kirjoitettaisiin samaa koodi uudelleen, eli palattaisiin 70-luvulle. Nykyisin kasvanut koneteho kompensoi usein tehottomamman oliokoodin ja olio-ohjelmoinnin ansiosta pystytään kirjoittamaan luotettavampia (?) ja monimutkaisempia ohjelmia. Eli etusija pitää antaa koodin selkeydelle ja ylläpidettävyydellä. Edellä esitetyt "kikkailut" huonontavat ylläpidettävyyttä jos jotakin oleellista muutetaan.

Tehtävä 9.12 Yliluokan alustajan kutsu

Pöytätestaa sekä AikaSek8.java että AikaSekB.java alustuksilla
AikaSek8 a4 = new AikaSek8(1,95,70);
AikaSekB a4 = new AikaSekB(1,95,70);

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys