Возможно, вы ищете это
Child = Class.new Parent do
def foo
"foo"
end
end
Child.ancestors # => [Child, Parent, Object, Kernel]
Child.new.bar # => "bar"
Child.new.foo # => "foo"
Поскольку parent является аргументом для Class.new, вы можете поменять его другими классами.
Я использовал эту технику раньше, когда писал определенные виды тестов. Но мне трудно думать о многих хороших оправданиях, чтобы сделать такую вещь.
Я подозреваю, что вам действительно нужен модуль.
class Agent
def self.hook_up(calling_class, desired_parent_class)
calling_class.send :include , desired_parent_class
end
end
module Parent
def bar
"bar"
end
end
class Child
def foo
"foo"
end
Agent.hook_up(self, Parent)
end
Child.ancestors # => [Child, Parent, Object, Kernel]
Child.new.bar # => "bar"
Child.new.foo # => "foo"
Хотя, конечно, Агент вообще не нужен
module Parent
def bar
"bar"
end
end
class Child
def foo
"foo"
end
include Parent
end
Child.ancestors # => [Child, Parent, Object, Kernel]
Child.new.bar # => "bar"
Child.new.foo # => "foo"