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