Vorrei specificare in modo dinamico la classe genitore per una classe in Ruby. Considerate questo codice:Come modificare dinamicamente l'ereditarietà in Ruby
class Agent
def self.hook_up(calling_class, desired_parent_class)
# Do some magic here
end
end
class Parent
def bar
puts "bar"
end
end
class Child
def foo
puts "foo"
end
Agent.hook_up(self, Parent)
end
Child.new.bar
Né il Parent
né la definizione di classe Child
specifica una classe genitore, in modo che entrambi ereditano da Object. La mia prima domanda è: cosa dovrei fare in Agent.hook_up
per rendere Parent
la superclasse di Child
(così ad esempio gli oggetti Child
possono ereditare il metodo "bar").
mia seconda domanda è: posso bisogno di passare il primo argomento di Agent.hook_up
, o c'è qualche modo il metodo hook_up
può programmazione determinare la classe da cui è stato chiamato?
Um, se si sta impostando o cambiando dinamicamente il genitore di una classe, allora è ragionevole affermare che il proprio modello di oggetto non riflette una vera relazione * is-a *. Una soluzione più adatta è probabilmente la composizione. – cletus
È necessario chiarire se si tratta di un esercizio di pensiero o perché si vorrebbe usarlo in pratica. I linguaggi riflettenti dinamici non significano che è pulito per cambiare dinamicamente l'ereditarietà. Con una grande potenza (espressiva), derivano grandi responsabilità :) –
@letletus Non sono un grande fan dell'ereditarietà in generale, ma per il problema che sto esaminando, l'ereditarietà e l'is-a, la relazione descrive perfettamente la relazione. L'unico problema è che un oggetto non saprà cosa è "fino a ora di esecuzione". –