Vienas klases objekti ar dažādām īpašībām

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

Atbildēt

Jūsu e-pasta adrese netiks publicēta.