Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

9.4.3 Koostaminen

Seuraava mahdollisuus olisi uuden luokan koostaminen ( aggregation) vanhasta aikaluokasta ja sekunneista. Tämä mahdollisuus meillä on aina käytössä vaikkei alkuperäistä lähdekoodia olisikaan käytössä. Tätä vaihtoehtoa pitää aina vakavasti harkita. Tehdään koodi sellaiseksi, että uusi luokka tulostaa aina sekunnit ( inline- muotoa käytetään tilan säästämiseksi):

olioalk\aikacla7.cpp - laajentaminen koostamalla

	#include <iostream.h>
	#include <iomanip.h>
	
	class cAika {
	... kuten aikacla5.cpp, mutta seuraava muutos:
	  void tulosta(int lf=1) const  {
	    cout << setfill('0') << setw(2) << h << ":" << setw(2) << m;
	    if ( lf ) cout << endl;
	  }
	};
	
	class cAikaSek {
	  cAika hm;
	  int s;
	public:
	  void aseta(int ih=0, int im=0, int is=0) {
	    s = is; hm.aseta(ih,im); lisaa(0);
	  }
	  cAikaSek(int ih=0, int im=0, int is=0) { aseta(ih,im,is); }
	  void lisaa(int lisa_min, int lisa_sek=0) {
	    s += lisa_sek;
	    hm.lisaa(lisa_min+s/60);
	    s %= 60;
	  }
	  void tulosta(int lf=1) const  {
	    hm.tulosta(0);
	    cout <<  ":" << setw(2) << s;
	    if ( lf ) cout << endl;
	  }
	};
	
	
	int main(void)
	{
	  cAika a1, a2(13), a3(14,175);
	  a1.tulosta(); a2.tulosta();  a3.tulosta();
	  a1.aseta(12,15); a2.aseta(16,-15);
	  a1.tulosta(); a2.tulosta();
	  cAikaSek a4(12,55,45); a4.tulosta(1);        // lisätty uusi
	  a4.lisaa(3,30);     a4.tulosta(1);
	  return 0;
	}

Valitettavasti emme aivan täysin onnistuneet. Nimittäin alkuperäisen luokan tulosta oli niin tyhmästi toteutettu, että se tulosti aina rivinvaihdon. Tämmöistä hölmöyttä ei pitäisi mennä koskaan tekemään ja siksipä alkuperäinen luokka pitää joka tapauksessa palauttaa valmistajalle remonttiin. No luokan valmistaja muutti tulosta- metodia siten, että se oletuksena tulostaa rivinvaihdon (merk. lf = line feed), mutta pyydettäessä jättää sen tekemättä. Näin vanha koodi voidaan käyttää muuttamattomana.

Palaamme tulostusongelmaan myöhemmin ja keksimme silloin paremman ratkaisun, jota olisi pitänyt käyttää jo alunperin.

Luokassa on niin vähän ominaisuuksia, että uudessa luokassamme olemme joutunee itse asiassa tekemään kaiken uudelleen ja on kyseenalaista olemmeko hyötyneet vanhasta luokasta lainkaan. Tämä on onneksi lyhyen esimerkkimme vika, todellisilla luokilla säästö kokonaan uudestaan kirjoitettuun verrattuna olisi moninkertainen.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys