2012-04-22 9 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

'extend'は有効なRubyではありません。継承の構文は 'Foo

+0

私はテキストエリアに<をタイプすることはできません。私のコードを切り捨てるだけなので、代わりにそれを表現するためにextendsを使います。 – toy

+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 
関連する問題