Ruby on rails 多态Ruby SimpleLegator
除了Ruby on rails 多态Ruby SimpleLegator,ruby-on-rails,ruby,oop,delegates,polymorphism,Ruby On Rails,Ruby,Oop,Delegates,Polymorphism,除了SimpleDelegator之外,还有哪些方法可以利用多态性而不修改底层对象 这是一个示例,SimpleLegator无法解决的问题 其目的是能够将原始对象(delicious\u food)与任何其他(yak\u food)包装在一起,以便替代方法(delicious?)取决于基础对象的非替代方法 class Food def initialize(color) @color = color end def delicious? color == :red
SimpleDelegator
之外,还有哪些方法可以利用多态性而不修改底层对象
这是一个示例,SimpleLegator
无法解决的问题
其目的是能够将原始对象(delicious\u food
)与任何其他(yak\u 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
另一种方法是使用extend扩展实例的方法。(这是大多数DCI实现在运行时通过行为扩展对象所做的)
在这种情况下使用模块对我来说也更合理。装饰师不应该改变内部结构。好主意。出于某种原因,没有考虑扩展。
yak_food = delicious_food.clone
def yak_food.color
:green
end
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.