2012-07-18 86 views
-1

我正在使用Tumblr API,他們有各種類型的帖子(文本,照片,視頻,報價,鏈接等)。我想創建一個父類TumblrPost,然後創建一些子類,如TumblrTextPost。如果我這樣做,是否有辦法通過TumblrPost(即TumblrPost.all.each)訪問每個帖子,而不管子類是什麼? (注意:我正在使用MongoDB和Mongoid)Ruby繼承,模塊或子類

或者我應該讓每個子類成爲一個模塊,然後只是做TumblrPost類包括TumblrTextPost等?

回答

1

我不確定你是否在談論訪問每個TumblrPost實例或每個TumblrPost子類。

如果您要訪問的每個實例,您可以設置在TumblrPost一個類的實例變量,並在構造函數中每一個新實例更新:

class TumblrPost 
    @all_instances = [] 

    class << self 
    attr_accessor :all_instances 
    end 

    def initialize 
    TumblrPost.all_instances << self 
    end 
end 

TumblrTextPost = Class.new(TumblrPost) 

t1 = TumblrPost.new 
t2 = TumblrTextPost.new 

puts TumblrPost.all_instances 

如果,另一方面,你想成爲能夠迭代TumblrPost的每個子類,你可以使用繼承的鉤子來跟蹤它們。

class TumblrPost 
    @all_subclasses = [] 

    class << self 
    attr_accessor :all_subclasses 
    end 

    def self.inherited(subclass) 
    @all_subclasses << subclass 
    end 
end 

TumblrTextPost = Class.new(TumblrPost) 
puts TumblrPost.all_subclasses 

來源:拉斯·奧爾森的Eloquent Ruby