从多个装饰中获取扩展对象

时间:2018-09-25 02:39:01

标签: ruby

我使用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的类?

1 个答案:

答案 0 :(得分:2)

我认为您不能使用SimpleDelegator来做到这一点。

您需要自己实现此方法。

例如:

class MyDelegator < SimpleDelegator
  def original_object
    obj = __getobj__
    obj.is_a?(MyDecorator) ? obj.original_object : obj
  end
end

所有装饰器都应继承自MyDelegator