如果我有这样的模型:
class Media
attr_reader :title, :created_at
end
class Video < Media
end
class Picture < Media
attr_reader :image_url
end
因此,在Picture
类中,超类中不应存在一个属性。当你想要检索所有媒体时,人们通常会做什么?你想在方法image_url
上抛出异常吗?或者你会如何重新塑造它?
答案 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