Ho questa classe di esempio:
class Primo
def initialize arg_nome
@nome = arg_nome.capitalize
# Infine definisco i metodi dinamici
define_singleton_method arg_nome, lambda { “Si. #{presentazione}” }
end
def presentazione
“Sono #{@nome}, un #{self.class.name}”
end
def descrizione
“Io sono un #{self.class.name}”
end
end
irb(main):015:0> p=Primo.new “marco”
=> #<Primo:0x2549c10 @nome=“Marco”>
irb(main):017:0> p.presentazione
=> “Sono Marco, un Primo”
irb(main):018:0> p.descrizione
=> “Io sono un Primo”
Il metodo dinamico funziona e con una flessibilita’ pazzesca, viene
richiamato infatti il metodo presentazione che usa una variabile di
istanza
irb(main):016:0> p.marco
=> “Si. Sono Marco, un Primo”
Ora ho questa seconda classe che eredita dalla prima:
class Secondo < Primo
def initialize arg_nome
super arg_nome
# Definisco il metodo dinamico del figlio
define_singleton_method “cose_del_#{self.class.name}”, lambda {
return “Questo lo posso fare solo io” }
end
Aggiungo elementi alla descrizione del padre
def descrizione
“#{super} ma faccio anche le cose del #{self.class.superclass.name}”
end
end
irb(main):036:0> s=Secondo.new “luca”
=> #<Secondo:0x27f4320 @nome=“Luca”>
irb(main):038:0> s.presentazione
=> “Sono Luca, un Secondo”
irb(main):039:0> s.descrizione
=> “Io sono un Secondo ma faccio anche le cose del Primo”
Il metodo dinamico della classe padre viene correttamente aggiunto:
irb(main):037:0> s.luca
=> “Si. Sono Luca, un Secondo”
Ma non viene aggiunto il secondo metodo dinamico solo per la seconda
classe
irb(main):040:0> s.respond_to? :cose_del_secondo
=> false
Perche’?