Klasy i moduły a komunikacja

Mam takie dwa przykładowe fragmenty kodu:

Jest

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

Oraz:

armest = Armest.new("texture" => "rough", "color" => "silver")

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ź :).

Nie mozesz uzyc zwyklego dziedziczenia?

[code=ruby]class Wood; end
class Aluminum; end

class Element
attr_reader :attributes

def initialize(options = {})
@attributes = options
@attributes.merge!({material: material})
end

def material
Aluminum.new
end
end

class Armrest < Element
end

class Table < Element
def material
Wood.new
end
end

Armrest.new.attributes #=> {material: #Aluminium:0x0}
Table.new.attributes #=> {material: #Wood:0x0}[/code]

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? :slight_smile: