previous next Up Title Contents Index

9.4.2 Alkuperäisen luokan muuttaminen


Läheskään aina ei voi täysin välttää sitäkään, etteikö alkuperäistä luokkaa joutuisi muuttamaan. Jos näin joudutaan tekemään, pitäisi tämä pystyä tekemään siten, että jo kirjoitettu luokkaa käyttävä koodi säilyisi täysin muuttumattomana (tai ainakin voitaisiin päivittää minimaalisilla muutoksilla) ja vasta uudessa koodissa käytettäisiin hyväksi luokan uusia ominaisuuksia.

Jos luokka on saatu joltakin kolmannelta osapuolelta, ei luokan päivittäminen edes ole mahdollista, vaan silloin täytyy turvautua muihin (parempiin) tapoihin.

Päivitämme nyt kuitenkin alkuperäistä luokkaa:

olioalk\aikacla6.cpp - laajentaminen muuttamalla kantaluokkaa

	#include <iostream.h>
	#include <iomanip.h>
	
	class cAika {
	  int h,m,s;                                  // lisätty s
	public:
	  cAika(int ih=0, int im=0, int is=0);        // lisätty is=0
	  void aseta(int ih,int im=0, int is=0);      // lisätty is=0
	  void lisaa(int lisa_min, int lisa_sek=0);   // lisätty lisa_sek=0
	  void tulosta(int tulsek=0) const;           // lisätty tulsek=0
	};
	
	void cAika::aseta(int ih,int im, int is)      // lisätty is
	{
	  h = ih; m = im; s = is;  lisaa(0,0);        // lisätty s=is ja ,0
	}
	
	cAika::cAika(int ih, int im, int is)          // lisätty int is
	{
	  aseta(ih,im,is);
	}
	
	void cAika::lisaa(int lisa_min, int lisa_sek) // lisätty int lisa_sek
	{
	  s += lisa_sek;                                 // lisätty
	  int yht_min = h * 60 + m + lisa_min + s / 60;  // lisätty s / 60
	  s = s % 60;                                    // lisätty
	  h = yht_min / 60;
	  m = yht_min % 60;
	}
	
	void cAika::tulosta(int tulsek) const         // lisätty int tulsek
	{
	  cout << setfill('0') << setw(2) << h << ":" << setw(2) << m;
	  if ( tulsek ) cout << ":" << setw(2) << s;  // lisätty
	  cout << endl;
	}
	
	int main(void)
	{
	  cAika a1, a2(13), a3(14,175);               // ei muutoksia!
	  a1.tulosta(); a2.tulosta();  a3.tulosta();
	  a1.aseta(12,15); a2.aseta(16,-15);
	  a1.tulosta(); a2.tulosta();
	  cAika a4(12,55,45); a4.tulosta(1);          // lisätty uusi
	  a4.lisaa(3,30);     a4.tulosta(1);
	  return 0;
	}
Huh huh! Tulipa paljon muutoksia, mutta onnistuimme kuitenkin pitämään alkuperäisen pääohjelman koodin muuttumattomana. Tulostuksessa olisi tietysti voitu valita sekin linja, että aina tulostetaan sekunnit tai sekuntien tulostus on oletuksena. Kumpikin valinta olisi aiheuttanut olemassa olevan koodin toiminnan muuttumisen. Jos näin olisi haluttu, niin sitten olisi valittu niin.

Tehtävä 9.83 Sekuntien tulostus aina tai oletuksena

Muuta ohjelmaa aikacla6.cpp siten, että sekunnit tulostetaan aina.
Muuta ohjelmaa aikacla6.cpp siten, että sekunnit tulostetaan oletuksena jos ne on != 0.


previous next Up Title Contents Index