Ruby继承,模块或子类

时间:2012-07-18 16:36:24

标签: ruby inheritance module

我现在正在使用Tumblr API,他们有各种类型的帖子(文字,照片,视频,报价,链接等)。我想制作一个父类TumblrPost,然后是一堆子类,如TumblrTextPost。如果我这样做,是否有办法通过TumblrPost(即TumblrPost.all.each)访问每个帖子而不管子类? (注意:我正在使用MongoDB和Mongoid)

或者我应该让每个子类成为一个模块,然后只做TumblrPost类包括TumblrTextPost等?

1 个答案:

答案 0 :(得分: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

资料来源:Russ Olsen的Eloquent Ruby