Inheritance 在具有多个类型的集合上迭代-如何使用特定于类型的属性?

Inheritance 在具有多个类型的集合上迭代-如何使用特定于类型的属性?,inheritance,polymorphism,Inheritance,Polymorphism,我想迭代一个包含各种类型对象的集合。如果我想使用公共属性,这很容易,因为我不必测试类型——它们都会响应 但是如果我想使用特定于类型的属性呢?我应该怎样做才能使我的代码干净漂亮呢 是否每次添加新类型时都会更新一个大的if-elseif语句 下面的代码示例是RubyonRails,但这个问题适用于任何支持多态性的语言 class Person < ActiveRecord::Base has_many :events has_many :meals, :through => :e

我想迭代一个包含各种类型对象的集合。如果我想使用公共属性,这很容易,因为我不必测试类型——它们都会响应

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

是否每次添加新类型时都会更新一个大的
if-elseif
语句

下面的代码示例是RubyonRails,但这个问题适用于任何支持多态性的语言

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