class Aluminum
def initialize
@attributes = {"flexibly" => "low", "shine" => "reflective", "strength" => "high"}
end
end
Oraz: wariant 1:
class Element
def initialize(options = {})
@attributes = options
@attributes.merge!({"material" => "zmienna_material"})
end
end
class Armrest < Element
"zmienna_material" = Aluminum.new
end
Lub: wariant 2:
module Element
def initialize(options = {})
@attributes = options
@attributes.merge!({"material" => "zmienna_material"})
end
end
class Armrest
include Element
"zmienna_material" = Aluminum.new
end
end
Metodę initialize wrzuciłem do modułu(wariant 2) lub klasy nadrzędnej(wariant 1), ponieważ ten moduł czy klasa ma być wykorzystywana wielokrotnie. Jak więc przekazać “zmienna_material” do klasy nadrzędnej lub inkludowanego modułu? Generalnie chodzi mi o komunikację/przekazywanie danych w obydwie strony. Będę wdzięczny za odpowiedź :).
Dzięki za odpowiedź. To co pokazałeś jest rozwiązaniem problemu, gdyż w przypadku klasy Table, “material” jest po prostu nadpisywany.
Ale wciąż bardzo nurtuje mnie pytanie: Czy jest możliwe w Ruby przekazywanie wartości zmiennych do Klasy nadrzędnej w jakiś inny sposób niż po przez metodę?
EDIT:
Można to zrobić jeszcze inaczej. Znalazłem w internecie pewien krótki poradnik http://rubylearning.com/satishtalim/ruby_inheritance.html i dowiedziałem się, że aby przekazać dane do klasy nadrzędnej można użyć słowa kluczowego:
super(args*)
Więc Twój przykład po zmodyfikowaniu będzie wyglądał tak:
class Wood
def initialize
@attributes = {"flexibly" => "low", "shine" => "matt", "strength" => "medium"}
end
end
class Aluminum
def initialize
@attributes = {"flexibly" => "low", "shine" => "reflective", "strength" => "high"}
end
end
class Element
attr_reader :attributes
def initialize(material, options)
@attributes = options
@attributes.merge!({"material" => material})
end
end
class Armrest < Element
def initialize(options = {})
super(Aluminum.new, options)
end
end
class Table < Element
def initialize(options = {})
super(Wood.new, options)
end
end
armrest = Armrest.new("texture" => "rough", "color" => "silver")
p armrest #=> {<Armrest:0xa0268f4 @attributes={"texture"=>"rough", "color"=>"silver", "material"=>#<Aluminum:0xa0268e0 @attributes={"flexibly"=>"low", "shine"=>"reflective", "strength"=>"high"}>}>}
i wykonają się metody - inicjalizacje zdefiniowe w klasie Armrest, oraz w klasie Element.
Ale powracając do pytania, są jeszcze na to jakieś inne sposoby, pytam z ciekawości?