Zadanie z programowania obiektowego w ruby'm

Siemanko, przyswajam właśnie podstawy programowania obiektowego. Przy przerabianiu jednego zadanka z C zaciąłęm się i nie estem w stanie popchnąć tego sam. Wygląda to tak:

Stwórz klasy:
• Osoba z polami: imie, nazwisko, wiek, konstruktorem inicjującym wszystkie pola oraz
metodą Wypisz.
• Książka z polami: tytul, autor (typu Osoba), data wydania oraz metodą Wypisz
Utwórz różne obiekty stworzonych klas. Wykonaj metody Wypisz.

O ile pierwsza część zadania nie stwarza problemu, o tyle z drugą nie mogę dać sobie rady. Problem polega na tym, że nie bardzo wiem jak zrealizować autora typu Osoba. Z góry dzięki za sugestie.

[code=Ruby]class Osoba
def initialize(imie, nazwisko, wiek)
@imie, @nazwisko, @wiek = imie, nazwisko, wiek
end

def wypisz
puts “#{@imie} #{@nazwisko}, wiek: #{@wiek} lat”
end
end

class Ksiazka
def initialize(tytul, autor, data_wydania)
@tytul, @autor, @data_wydania = tytul, autor, data_wydania
end

def wypisz
puts “Książka ‘#{@tytul}’, autor: #{@autor.wypisz}, data publikacji: #{@data_wydania}”
end
end[/code]
Czy o coś takiego chodzi? : )

EDIT: A, jeszcze wywoływanie.

jrr_tolkien = Osoba.new "J.R.R.", "Tolkien", 120 lotr = Ksiazka.new "The Lord of the Rings", jrr_tolkien, Time.new(1954, 5, 6) puts jrr_tolkien.wypisz puts lotr.wypisz

Do kodu świstaka dorzuciłbym jeszcze sprawdzanie osoby przez .class (ew. razem z superclass jeżeli chcemy podpinać klasy dziedziczące po osobie), albo prościej - respond_to na metodzie wypisz.

Do czegoś takiego mniej więcej doszedłem. Wydawało mi się, że chodzi raczej o to w efekcie finalnym inicjując obiekt należący do klasy "Książka"inicjujemy również autora, należącego do klasy osoba.

W każdym razie dzięki za pomoc!

[quote=szatan_zuo]Do czegoś takiego mniej więcej doszedłem. Wydawało mi się, że chodzi raczej o to w efekcie finalnym inicjując obiekt należący do klasy "Książka"inicjujemy również autora, należącego do klasy osoba.

W każdym razie dzięki za pomoc![/quote]
to tak może działać

lotr = Ksiazka.new("The Lord of the Rings", Osoba.new("J.R.R.", "Tolkien", 120), Time.new(1954, 5, 6))

możesz też ustawić konstruktor żeby tworzył domyślnie nową “Osobę”

…tyle że to mija się z celem. Kod swistak35 jest najlepszy.

Kurczę faktycznie! Wielkie dzięki za pomoc!

[quote=swistak35][code=Ruby]class Osoba
def initialize(imie, nazwisko, wiek)
@imie, @nazwisko, @wiek = imie, nazwisko, wiek
end

def wypisz
puts “#{@imie} #{@nazwisko}, wiek: #{@wiek} lat”
end
end

class Ksiazka
def initialize(tytul, autor, data_wydania)
@tytul, @autor, @data_wydania = tytul, autor, data_wydania
end

def wypisz
puts “Książka ‘#{@tytul}’, autor: #{@autor.wypisz}, data publikacji: #{@data_wydania}”
end
end[/code]
Czy o coś takiego chodzi? : )

EDIT: A, jeszcze wywoływanie.

jrr_tolkien = Osoba.new "J.R.R.", "Tolkien", 120 lotr = Ksiazka.new "The Lord of the Rings", jrr_tolkien, Time.new(1954, 5, 6) puts jrr_tolkien.wypisz puts lotr.wypisz
[/quote]
Mozna to tez zapisac tak korzystajac z Ruby idioms. Wiem ze chodzi o prostote przykladu ale jak sie uczyc to sie uczyc :wink:

http://pastie.org/4558665