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