多态未实现的方法。人们通常做什么?

时间:2012-04-22 16:11:44

标签: ruby oop domain-driven-design polymorphism

如果我有这样的模型:

class Media
  attr_reader :title, :created_at
end

class Video < Media
end

class Picture < Media
  attr_reader :image_url
end

因此,在Picture类中,超类中不应存在一个属性。当你想要检索所有媒体时,人们通常会做什么?你想在方法image_url上抛出异常吗?或者你会如何重新塑造它?

1 个答案:

答案 0 :(得分:2)

如果您对所有媒体感兴趣,那么您不应该关心它是视频还是图片。换句话说,接受Media集合的方法不应该调用来自Media后代的任何方法。如果您需要所有图片,请使用Picture,不要过度概括。

如果你仍然需要处理所有媒体,同时告诉类型,你可以分支类型。

def process_media media
  media.each do |m|
    if m.is_a? Picture
      # work with picture
    elsif m.is_a? Video
      # work with video
    end
  end
end

另一种方法是使用鸭子打字。也就是说,如果它有方法image_url,那么它必须是某种图片。

def process_media media
  media.each do |m|
    if m.respond_to? :image_url
      # work with picture
    elsif m.respond_to? :bitrate
      # work with video
    end
  end
end