Я хочу перебрать коллекцию, которая содержит объекты различных типов. Если я хочу использовать общий атрибут, это легко, потому что мне не нужно проверять тип - они все отвечают.
Но что, если я хочу использовать атрибут, специфичный для типа? Как мне поступить так, чтобы мой код был красивым и чистым?
У меня есть только один большой оператор 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
Вышеуказанное кажется хрупким. Есть ли лучший способ?