在不修改底层对象的情况下利用多态性的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.