【问题标题】:Polymorphic Ruby SimpleDelegator多态 Ruby SimpleDelegator
【发布时间】: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


    【解决方案1】:

    另一种方法是使用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.
    

    【讨论】:

    • 在这种情况下使用模块对我来说似乎也更合理。装饰者不应该改变内部结构。
    • 好主意。出于某种原因没有考虑extend
    猜你喜欢
    • 2012-10-17
    • 2014-04-18
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多