previous next Up Title Contents Index

9.5.1 Miksi ja miten


Muutenkin saattaa tulla tilanteita, joissa luokan ulkopuolinen haluaa päästä käsiksi sisäisiin tietoihin. Ainakin lukemana niitä. Eihän ole ollenkaan tavatonta ajankaan kanssa, että joku haluaisi tietää tunnit, muttei tulostaa? Mikä ratkaisuksi? Julistetaanko kaikki attribuutit julkisiksi (public)? No ei sentään! Kirjoitetaan saantimetodi kullekin attribuutille, jonka perustellusti voidaan katsoa tarpeelliseksi jollekin ulkopuoliselle voitavan julkaista:

"Lopullinen" versio aikaluokastamme voisikin siis olla seuraava:

olioalk\aikaclaC.cpp - saantimetodit

	class cAika {
	  int h,m;
	public:
	  virtual void aseta(int ih=0,int im=0, int is=0) {...}
	  ...
	  virtual void tulosta(int lf=1) const  { ... }
	  int hh() const { return h; }                                // saantimetodi
	  int mm() const { return m; }                                // saantimetodi
	};
Huomattakoon nyt, että perinnässä ei tarvitse määritellä uudestaan saantifunktioita hh() ja mm(), ainoastaan uudet, eli esimerkissämme ss().

Nyt voitaisiin esimerkiksi kutsua:

	cout << a1.hh() << ":" << pAika->mm() << ":" << a4.ss() << endl;
Mikä tässä sitten on erona attribuuttien julkaisemiseen verrattuna? Se että attribuutit ovat nyt tietyssä mielessä vain luettavissa (read-only), eli niitä voi lukea saantimetodien avuilla, mutta niitä voi asettaa vain aseta- metodin avulla, joka taas pystyy suorittamaan oikeellisuustarkistukset ja näin olion tila ei koskaan pääse muuttumaan olion itsensä siitä tietämättä.

Saantimetodit kannattaa ilman muuta kirjoittaa inline, sillä niistä kääntäjä voi sitten kääntää nopeaa koodia, eikä saantibyrokratiasta tule yhtään kustannuksia suoraan attribuuttiin viittaamiseen verrattuna.

Kannattaakin harkita, nimeäisikö attribuutit uudelleen: ah,am,as, jotta nimet h,m,s jäisi vapaaksi saantimetodeille! Toisaalta tärkeimmistä attribuuteista voisi tehdä myös pitkillä nimillä varustetut saantimetodit: esimerkiksi tunnit(), minuutit() ja sekunnit(). Rakkaalla lapsella voi olla montakin nimeä ja inlinen ansiosta tämähän ei "maksa mitään".

Tehtävä 9.87 Saantimetodi sekunneille

Täydennä aikaclaB.cpp:hen em. saantimetodit ja lisäksi ss() aliluokkaan cAikaSek.
Kirjoita myös pitemmillä nimillä varustetut saantimetodit.

Tehtävä 9.88 Saantimetodien käyttäminen

Muuta vielä edellisessä tehtävässä jokainen mahdollinen viittaus luokan sisälläkin saantimetodeja käyttäväksi suoran attribuuttiviittauksen sijasta. Käännä alkuperäinen koodi ja uusi koodi, sekä vertaa .exe tiedostoja keskenään jollakin vertailuohjelmalla.


previous next Up Title Contents Index