## 5 Luokan muuttujat **Tehtävä:** Luvun viimeisessä tehtävässä harjoitellaan luokkamuuttujien käyttämistä. Tehtävänäsi on luoda luokka Elain, johon tallennettaan jotain perustietoja eri eläimistä. Määrittele luokkaan kaksi luokkamuuttujaa edellinen ja maara, jotka alustetaan arvoon "" ja 0. Tämän jälkeen tee luokkaan rakentaja, joka ottaa argumentteina kaksi merkkijonoa, rotu ja nimi. Oliota luotaessa edellisen luodun olion rotu tallenetaan luokkamuuttujaan edellinen. Luonnin yhteydessä maara-muuttuja kasvaa yhdellä. Luokkaan tulee myös kolme metodia, tiedot, poista ja tilanne. Tiedot-metodi tulostaa "Olen [olion rotu] ja nimeni on [olion nimi]". Poista tulostaa "[olion nimi] poistettu!" ja vähentää luokkamuuttujaa maara yhdellä. Tilanne tulostaa "Eläimiä on tällä hetkellä [maara] kappaletta. Viimeisin rekisteröity eläin oli [viimeisimmän luodun olion rotu].". Tämän jälkeen kopioi seuraava ohjelmakoodi lähdekoodiisi; koodilla kokeillaan luokkamäärittelyn toimintaa: ``` koira = Elain.new("koira","Rekku") kissa = Elain.new("kissa","Raatelija") lintu = Elain.new("kanarialintu","Tirppa") koira.tiedot() kissa.poista() lintu.tilanne() ``` Toimiessaan oikein ohjelma tulostaa seuraavan tekstin ja tallentaa sen tiedostoon 9-4_tiedosto.txt Example output: ``` Olen koira ja nimeni on Rekku! Raatelija poistettu! Eläimiä on tällä hetkellä 2 kappaletta. Viimeisin rekisteröity eläin oli kanarialintu. ``` **Vastaus** ``` #!/usr/bin/env ruby # coding: utf-8 $_tiedosto = "9-4_tiedosto.txt" if (!File.exists?($_tiedosto)) begin File.open($_tiedosto, File::RDWR|File::CREAT, 0644) rescue puts "Tiedostoon #{$_tiedosto} ei voida kirjoittaa" Process.exit(1) end else File.open($_tiedosto, "w+") end ########## class Elain @@edellinen = "" @@maara = 0 def initialize(rotu, nimi) @nimi = nimi @rotu = rotu @@edellinen = rotu @@maara += 1 end def tiedot lause = "Olen #{@rotu} ja nimeni on #{@nimi}!" puts lause; File.open($_tiedosto, "a").write(lause + "\n") end def poista lause = "#{@nimi} poistettu!" @@maara -= 1 puts lause; File.open($_tiedosto, "a").write(lause + "\n") # Ei välttämättä tarpeellinen... ObjectSpace.define_finalizer(self, self.class.method(:finalize)) end def tilanne lause = "Eläimiä on tällä hetkellä #{@@maara} kappaletta.\nViimeisin rekisteröity eläin oli #{@@edellinen}." puts lause; File.open($_tiedosto, "a").write(lause + "\n") end # Ei välttämättä tarpeellinen... def self.finalize(object_id) end end koira = Elain.new("koira","Rekku") kissa = Elain.new("kissa","Raatelija") lintu = Elain.new("kanarialintu","Tirppa") koira.tiedot() kissa.poista() lintu.tilanne() ```