我使用SimpleDelegator
创建了一些装饰器,为对象添加了额外的功能。我需要装饰一个对象两次,如下所示:
Tracked.new(Audited.new(User.new))).save
这是装饰器的基本结构:
class Tracked #or Audited
delegate :id, to: :__getobj__
def initialize(extened_object)
super(extened_object)
@extened_object = extened_object
end
def itself
__getobj__
end
def save
super
# the extended behavior
end
end
我想从对象访问类User
。在Audited
中,如果我用@extended_object.class
调用Audited.new(User.new)).save
,则会得到User
。在Tracked
中,如果我用@extended_object.class
呼叫Tracked(Audited.new(User.new))).save
,则会得到Audited
。
无论装饰多少次,如何获得extended_object
的类?
答案 0 :(得分:2)
我认为您不能使用SimpleDelegator
来做到这一点。
您需要自己实现此方法。
例如:
class MyDelegator < SimpleDelegator
def original_object
obj = __getobj__
obj.is_a?(MyDecorator) ? obj.original_object : obj
end
end
所有装饰器都应继承自MyDelegator