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
答案 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.