2012-04-22 22 views
1

如果我有這樣一個模型:多態性未實現方法。人們通常做什麼?

class Media 
    attr_reader :title, :created_at 
end 

class Video < Media 
end 

class Picture < Media 
    attr_reader :image_url 
end 

因此,在Picture類存在,不應該在超存在的一個屬性。當你想要檢索所有媒體時,人們通常會做什麼?你想拋出方法image_url的例外嗎?或者你將如何重新建模?

+0

'extends'是無效的Ruby。繼承的語法是'Foo 2012-04-22 16:38:08

+0

我不能在textarea中鍵入<它將截斷我的代碼,所以我使用extends來表示它。 – toy 2012-04-22 17:39:15

+0

我不確定你在說什麼,因爲這根本不是真的。我用正確的語法編輯了你的問題,''顯示得很好。 – 2012-04-22 17:40:23

回答

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 
相關問題