1

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
4

1 回答 1

4

另一种方法是使用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.
于 2012-06-28T15:15:17.867 回答