【发布时间】:2012-06-29 14:33:11
【问题描述】:
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
【问题讨论】:
标签: ruby-on-rails ruby oop delegates polymorphism