我想迭代一个包含各种类型对象的集合。如果我想使用一个公共属性,那很简单,因为我不需要测试类型 - 它们都会响应。
但是如果我想使用特定于类型的属性呢?我应该怎么做才能让我的代码干净整洁?
每次添加新类型时,我是否只有一个大的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
以上看起来很脆弱。还有更好的方法吗?