我现在正在使用 Tumblr API,他们有各种类型的帖子(文本、照片、视频、引用、链接等)。我想创建一个父类 TumblrPost,然后创建一堆子类,例如 TumblrTextPost。如果我这样做,是否有办法通过 TumblrPost(即 TumblrPost.all.each)访问每个帖子而不考虑子类?(注意:我正在使用 MongoDB 和 Mongoid)
或者我应该让每个子类成为一个模块,然后只做 TumblrPost 类包括 TumblrTextPost 等?
我现在正在使用 Tumblr API,他们有各种类型的帖子(文本、照片、视频、引用、链接等)。我想创建一个父类 TumblrPost,然后创建一堆子类,例如 TumblrTextPost。如果我这样做,是否有办法通过 TumblrPost(即 TumblrPost.all.each)访问每个帖子而不考虑子类?(注意:我正在使用 MongoDB 和 Mongoid)
或者我应该让每个子类成为一个模块,然后只做 TumblrPost 类包括 TumblrTextPost 等?
我不确定您是在谈论访问每个 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