Я решил это, используя немного метапрограммирования!Теперь моя модель корзины работает так:
def after_initialize
extend BoxStandardMethods
if self.box_behavior_type?
extend Object.const_get(box_behavior_type)
end
end
, где BoxStandardMethods - это модуль, который имеет все методы, которые есть в стандартной корзине (add_product, remove_product, get_total и т. Д.), И если я хочу переопределить любой из этих методов, я просто устанавливаю атрибут box_behavior_type корзины с модулем, который имеет функции, которые я хочу переопределить.Чтобы избежать несовместимости с интерфейсами, я создаю расширяемые модули с настраиваемыми полями, которые обратно совместимы, т.е.стандартный метод add_product (product, amount) реализован как add_product (product, amount, * custom_data), и если custom_data равен nil, то вызывается супер-метод, эффективно вызывающий метод, реализованный в BoxStandardMethods
Ruby простоотлично подходит для такого подхода!Система работает около недели, и у меня не было никаких проблем!