Fel*_* D. 6 ruby oop delegation
假设我有这个班级和委托人
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"
Run Code Online (Sandbox Code Playgroud)
这显然是由于方法解析链而发生的。#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"
Run Code Online (Sandbox Code Playgroud)
我还可以MyObject使用define_method或instance_eval例如在实例的特征类上定义方法。我的问题如下:
有没有一种方法可以实现相同的目标,而无需更改包装对象的特征类,也无需克隆它,同时保持包装对象对下游对象的其他消费者不受影响?
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |