[Ruby] Pola statyczne a dziedziczenie

Witam, jestem jeszcze zielony w Rubym i mam następujący problem. Stworzyłem sobie taką klasę:

[code]class Bilet
@@cena = 1.50

def self.cena; @@cena; end

def to_s
	if @@cena.to_s.split(".")[1].length == 2 # jesli po konwercji na stringa po kropce są dwie cyfry to zwracamy takiego stringa
		@@cena.to_s
	else #jesli jest tylko jadna to dopisujemy zero
		@@cena.to_s + "0"
	end
end

end[/code]
ale potrzebuję też klasy reprezentującej Bilet Godzinny ze statyczną zmienną cena i takim samym getterem. Tylko jak chcę zrobić coś tego typu:

class BGodzinny < Bilet @@cena = 2.00 end
to później Bilet.cena zwraca mi wartość 2.00. Co robię źle? Da się zrobić to w jakiś ładny sposób żeby uniknąć powielania kodu? Bo oczywiście mogę sobię zrobić drugą klasę prawie identyczną ale z inną ceną, tylko to mi się wydaje ohydne :slight_smile:

używaj zmiennych instancji (z jednym znakiem @), zamiast zmiennych klasowych.

Moim zdaniem w tym przypadku akurat pola statyczne (klasowe) są wręcz na miejscu, ponieważ mając 100 instancji tego samego biletu, nie potrzebuję w każdym z nich trzymać jego ceny.

a podmień i zobacz, że zadziała :wink:

W Ruby class variables @@ są dzielone w hierarchi dziedziczenia (zmienisz @@cena w dziecku i zmieni się również w rodzicu).

Zamiast @@cena możesz użyć stałej CENA albo po prostu metody “cena” jeśli używasz dla instancji

[code=ruby]class Bilet
CENA = 1
end

class BGodzinny < Bilet
CENA = 2
end

Bilet::CENA
BGodzinny::CENA[/code]

Rzuć też okiem na rozwiązanie zadania 9 na stronie Agnessy

Jak uzyjesz @foo to tez zadziala (bedzie to zmienna klasy). ofc w metodach instancji trzeba by uzyc Klazz.foo
(a to: Ruby Object Model - http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4 chyba sobie dokleje do stopki :P)