如何从Ruby中的包装对象调用委托者的方法

时间:2018-04-12 23:11:17

标签: 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"

这显然是因为方法解析链而发生的。在#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"

我也可以使用MyObjectdefine_methodinstance_eval实例的本征类上定义方法。我的问题如下:

有没有一种方法可以在不改变包装对象的本征类的情况下实现同样的目的而不用克隆它同时保持包装对象不受下游对象的其他使用者的影响?

0 个答案:

没有答案