Me gustaría especificar dinámicamente la clase principal para una clase en Ruby. Considere este código:Cómo alterar dinámicamente la herencia en 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
Ni el Parent
ni la definición de clase Child
especifica una clase padre, por lo que ambos heredan del objeto. Mi primera pregunta es: ¿qué tendría que hacer en Agent.hook_up
para hacer Parent
la superclase de Child
(por ejemplo, los objetos Child
pueden heredar el método 'bar').
Mi segunda pregunta es: ¿Cómo puedo necesito para pasar el primer argumento de Agent.hook_up
, o hay alguna manera el método hook_up
puede determinar mediante programación la clase de la cual se llamaba?
Um, si configura dinámicamente o cambia el elemento primario de una clase, entonces es una afirmación razonable de que su modelo de objetos no refleja una verdadera relación * is-a *. Una solución más adecuada es probablemente la composición. – cletus
Debe aclarar si se trata de un ejercicio de reflexión, o por qué querría usar eso en la práctica. Los lenguajes reflectantes dinámicos no significan que esté limpio para cambiar dinámicamente la herencia. Con gran poder (expresivo), viene una gran responsabilidad :) –
@cletus No soy un gran admirador de la herencia en general, pero por el problema que estoy viendo actualmente, la herencia y la relación is-a describen perfectamente la relación. El único problema es que un objeto no sabrá qué es "hasta el momento de la ejecución". –