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

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_methodinstance_eval例如在实例的特征类上定义方法。我的问题如下:

有没有一种方法可以实现相同的目标,而无需更改包装对象的特征类,也无需克隆它,同时保持包装对象对下游对象的其他消费者不受影响?