1

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
4

1 に答える 1

4

別の方法は、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.
于 2012-06-28T15:15:17.867 に答える