我们说我有这个班级和委托人
class MyObject
def foo
"foo #{bar}"
end
def bar
"bar"
end
end
class MyDelegator < SimpleDelegator
def bar
"decorated bar"
end
end
MyDelegator.new(MyObject.new).foo # => "foo bar"
这显然是因为方法解析链而发生的。在#foo
类中找不到MyDelegator
,因此它被委托给MyObject
类。调用MyObject#foo
后,该方法会依次调用MyObject#bar
。
我可以MyDelegator#foo
以这种方式返回"foo decorated bar"
:
class MyObject
def foo
"foo #{bar}"
end
def bar
"bar"
end
end
class MyDelegator < SimpleDelegator
module MyMethods
def bar
"decorated bar"
end
end
def initialize(object)
super
object.singleton_class.include(object)
end
end
MyDelegator.new(MyObject.new).foo # => "foo decorated bar"
我也可以使用MyObject
或define_method
在instance_eval
实例的本征类上定义方法。我的问题如下:
有没有一种方法可以在不改变包装对象的本征类的情况下实现同样的目的而不用克隆它同时保持包装对象不受下游对象的其他使用者的影响?