多态Ruby SimpleDelegator

时间:2012-06-28 05:12:10

标签: ruby-on-rails ruby oop delegates polymorphism

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

1 个答案:

答案 0 :(得分:3)

另一种方法是使用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.