Итерация по коллекции с несколькими типами - как использовать специфичные для типа атрибуты? - PullRequest
1 голос
/ 11 августа 2011

Я хочу перебрать коллекцию, которая содержит объекты различных типов. Если я хочу использовать общий атрибут, это легко, потому что мне не нужно проверять тип - они все отвечают.

Но что, если я хочу использовать атрибут, специфичный для типа? Как мне поступить так, чтобы мой код был красивым и чистым?

У меня есть только один большой оператор if-elseif, который я обновляю каждый раз, когда добавляю новый тип?

Пример кода ниже - это Ruby on Rails, но этот вопрос относится к любому языку, который поддерживает полиморфизм.

class Person < ActiveRecord::Base
  has_many :events
  has_many :meals, :through => :events, :source => :eventable,
    :source_type => "Meal"
  has_many :workouts, :through => :events, :source => :eventable,
    :source_type => "Workout"
end

Затем я повторяю:

p = Person.find(1)

p.eventable.each do |e|
  if e.meal?
    puts e.food_type
  elsif e.workout?
    puts e.repetitions
  elsif {...}
end

Вышеуказанное кажется хрупким. Есть ли лучший способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...