gpt4 book ai didi

ruby-on-rails - 多态 Ruby SimpleDelegator

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:51 25 4
gpt4 key购买 nike

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.

关于ruby-on-rails - 多态 Ruby SimpleDelegator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11238428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com