迭代多种类型的集合 - 如何使用特定于类型的属性?

时间:2011-08-11 12:51:16

标签: inheritance polymorphism

我想迭代一个包含各种类型对象的集合。如果我想使用一个公共属性,那很简单,因为我不需要测试类型 - 它们都会响应。

但是如果我想使用特定于类型的属性呢?我应该怎么做才能让我的代码干净整洁?

每次添加新类型时,我是否只有一个大的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

以上看起来很脆弱。还有更好的方法吗?

0 个答案:

没有答案