我有一个生成子类实例的主类实例,这些子类需要将一些方法调用转发回主实例。
目前我的代码看起来像这样,但感觉我应该能够更有效地做同样的事情(也许使用method_missing?)
class Master
def initalize(mynum)
@mynum = mynum
end
def one_thing(subinstance)
"One thing with #{subinstance.var} from #{@mynum}"
end
def four_things(subinstance)
"Four things with #{subinstance.var} from #{@mynum}"
end
def many_things(times,subinstance)
"#{times} things with #{subinstance.var} from #{@mynum}"
end
def make_a_sub(uniqueness)
Subthing.new(uniqueness,self)
end
class Subthing
def initialize(uniqueness,master)
@u = uniqueness
@master = master
end
# Here I'm forwarding method calls
def one_thing
master.one_thing(self)
end
def four_things
master.four_things(self)
end
def many_things(times)
master.many_things(times,self)
end
end
end
m = Master.new(42)
s = m.make_a_sub("very")
s.one_thing === m.one_thing(s)
s.many_things(8) === m.many_things(8,s)
我希望你能看到这里发生了什么。我会使用method_missing,但我不知道如何应对某些调用有参数的可能性而有些没有(我不能真正重新排列Master方法的参数顺序)
感谢阅读!
答案 0 :(得分:6)
Delegate有帮助吗?它允许您将方法委托给第二个类
此库提供了三种不同的方法来将方法调用委托给对象。最简单易用的是SimpleDelegator。将对象传递给构造函数,并且将委派对象支持的所有方法。此对象可以在以后更改。
更进一步,顶级DelegateClass方法允许您通过类继承轻松设置委派。这是非常灵活的,因此可能是该库的最常见用途。
最后,如果您需要完全控制委派方案,则可以从抽象类Delegator继承并根据需要进行自定义。 (如果您发现自己需要这种控制,请查看可转发的,也可以在标准库中。它可能更适合您的需求。)
还有forwardable库
此库允许您逐个方法地将方法调用委托给对象。您可以使用Forwardable在类级别设置此委派,或使用SingleForwardable在对象级别处理它。