Ruby on rails 多态Ruby SimpleLegator

Ruby on rails 多态Ruby SimpleLegator,ruby-on-rails,ruby,oop,delegates,polymorphism,Ruby On Rails,Ruby,Oop,Delegates,Polymorphism,除了SimpleDelegator之外,还有哪些方法可以利用多态性而不修改底层对象 这是一个示例,SimpleLegator无法解决的问题 其目的是能够将原始对象(delicious\u food)与任何其他(yak\u food)包装在一起,以便替代方法(delicious?)取决于基础对象的非替代方法 class Food def initialize(color) @color = color end def delicious? color == :red

除了
SimpleDelegator
之外,还有哪些方法可以利用多态性而不修改底层对象

这是一个示例,
SimpleLegator
无法解决的问题

其目的是能够将原始对象(
delicious\u food
)与任何其他(
yak\u food
)包装在一起,以便替代方法(
delicious?
)取决于基础对象的非替代方法

class Food
  def initialize(color)
    @color = color
  end

  def delicious?
    color == :red
  end

  def color
    @color
  end
end

class FoodTasteOverride < SimpleDelegator
  def color
    :green
  end
end

delicious_food = Food.new(:red)
yak_food = FoodTasteOverride.new delicious_food

delicious_food.delicious? # true - expected
yak_food.delicious? # expecting false, but is true since the color come from delicious_food

另一种方法是使用extend扩展实例的方法。(这是大多数DCI实现在运行时通过行为扩展对象所做的)


在这种情况下使用模块对我来说也更合理。装饰师不应该改变内部结构。好主意。出于某种原因,没有考虑扩展。
yak_food = delicious_food.clone
def yak_food.color
  :green
end
class Food

  attr_reader :color

  def initialize(color)
    @color = color
  end

  def delicious?
    self.color == :red
  end

end

module FoodTasteOverride
  def color
    :green
  end
end


normal_food = Food.new(:red)
delicious_food = Food.new(:red)
yak_food = normal_food.extend(FoodTasteOverride)

puts delicious_food.delicious? # true - expected
puts yak_food.delicious? #false because the color is now green.