【发布时间】:2010-06-27 10:24:18
【问题描述】:
我想在 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
Parent 和 Child 类定义都没有指定父类,因此它们都继承自 Object。我的第一个问题是:我需要在Agent.hook_up 中做什么才能使Parent 成为Child 的超类(例如Child 对象可以继承'bar' 方法)。
我的第二个问题是:我是否需要将第一个参数传递给Agent.hook_up,或者hook_up 方法是否可以通过某种方式以编程方式确定调用它的类?
【问题讨论】:
-
嗯,如果您正在动态设置或更改类的父类,那么可以合理地断言您的对象模型没有反映真正的 is-a 关系。一个更合适的解决方案可能是组合。
-
你应该清楚这是否是一个思考练习,或者你为什么要在实践中使用它。动态反射语言并不意味着动态改变继承是干净的。拥有强大(表现力)的力量,就伴随着巨大的责任:)
-
@cletus 一般来说,我不是继承的忠实拥护者,但对于我目前正在研究的问题,继承和 is-a 关系完美地描述了这种关系。唯一的问题是对象直到运行时才知道它是什么。
标签: ruby metaprogramming