Mantošana, moduļu iekļaušana ļauj klasei pārņemt vai iekļaut kāda veida īpašības. Nesen saskāros ar problēmu, ka klasei īpašības ir jāmaina atkarībā no kāda tai piešķirtā atribūta. Sapratu, ka ierastā pieeja nederēs.
Mantošana neder, jo nav zināms kāda veida objekts tas būs. Iekļaut visas iespējamās īpašības arī nav laba ideja, jo mainoties īpašībām, objektam viena un tā patša nosaukuma metode, pēc loģikas, var darīt dažādas lietas. Tāpēc izveidoju mazliet citu pieeju.
Pieeja nav nekas jauns un neredzēts, bet man šķita interesanti. Vienīgā problēma ir tā, ka mainoties vēlreiz šai īpašībai, šajā gadījuma type, jaunas metodes tiek pievienotas, bet vecās netiek noņemtas noņemtas, tomēr ja metodes sakrīt, tad, protams, tās tiek pārrakstītas.
class Person
AVAILABLE_TYPES=[:infant,:child,:adult]
attr_accessor :name
attr_reader :type
def initalize(name)
self.name=name
self.type=:infant
end
def type=(value)
raise "Bad type." unless AVAILABLE_TYPE.include?(value)
self.type=value
add_properties
end
private
def add_properties
word_in_parts=self.type.to_s.match(/(\w{1})(\w*)/)
capital_word="#{word_in_parts[1].upcase}#{word_in_parts[2]}"
self.extend(Object.const_get(capital_word.to_sym))
end
end
module Infant
def favorite_drink
:milk
end
end
module Child
def favorite_drink
:juice
end
end
module Adult
def favorite_drink
:beer
end
end
oskars=Person.new("Oskars")
puts oskars.favorite_drink #=> :milk
oskars.type=:adult
puts oskars.favorite_drink #=> :beerŠīs īpašības var ērti izmantot, lai instanci papildinātu ar atribūtiem. Būtu labi, ja varētu noņemt nost jau pievienotās īpašības.
Bet neesmu vēl atradis veidu kā to izdarīt :).
