在不修改底层对象的情况下利用多态性的SimpleDelegator替代方法是什么?
这是一个例子,SimpleDelegator无法解决的问题。
其目的是能够用任何其他(delicious_food)包装原始对象(yak_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

实际使用替代方法的替代方法是什么相反,你不能修改底层对象,它的类或者克隆。
约束意味着您不能这样做:
yak_food = delicious_food.clone
def yak_food.color
  :green
end

最佳答案

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

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.

10-07 19:10
查看更多