Я нашел изящный способ решения проблемы с помощью доработок. В стандартной библиотеке уже есть класс, который позволяет делегировать каждый вызов метода целевому объекту. Delegator
и, соответственно, SimpleDelegator
Теперь есть способ вставить SimpleDelegator
в цепочку наследования, не наследуя ее напрямую, используя уточнения:
def self.include_delegator
mod = Module.new do
include refine(SimpleDelegator) { yield if block_given? }
end
self.send :include, mod
end
include_delegator
Теперь, чтобы воспользоваться SimpleDelegator
, установите цель делегирования в обратном вызове после инициализации следующим образом:
after_initialize do |instance|
__setobj__(instance.reachable)
end
Это эквивалентно прямому наследованию от SimpleDelegator и установке делегирования в конструкции, отсутствует ручное ведение методов делегирования, и вы можете избежать использования отсутствующего метода.