0

我有几个类,我希望每个类都在类级别上维护为将来查找而创建的所有实例的哈希。类似于:

class A
  def initialize(id, otherstuff)
    # object creation logic
    @@my_hash[id]=self
  end

  def self.find(id)
    @@my_hash[id]
  end
end

所以我可以然后A.find(id)取回正确的实例。

其中有几个类(A、B 等),都有 id,我希望所有这些都有这个功能。

我可以让它们都继承自一个超类,该超类具有它们可以利用的通用版本,因此我不必为每个类重新实现很多东西吗?

4

1 回答 1

0

是的,您可以从同一个超类继承,也可以使用模块和include

module M
  def initialize(id)
    @@all ||= {}
    @@all[id] = self
  end

  def print
    p @@all
  end
end

class C
  include M
  def initialize(id)
    super
    puts "C instantiated"
  end
end

如果要为每个子类保留单独的索引,可以执行以下操作:

def initialize(id)
  @@all ||= {}
  @@all[self.class] ||= {}
  @@all[self.class][id] = self
end

编辑:在您发表评论后,我发现您需要保留每类索引。所以:

class A
  def initialize(id)
    self.class.index(id, self)
  end

  def self.index id, instance
    @all ||= {}
    @all[id] = instance
  end

  def self.find(id)
    @all[id]
  end
end

class B < A
end

class C < A
end

a = A.new(1)
b = B.new(2)
c = C.new(3)
p A.find(1)
#=> #<A:0x10016c190>
p B.find(2)
#=> #<B:0x10016c140>
p C.find(3)
#=> #<C:0x10016c118>
p A.find(2)
#=> nil
于 2013-03-12T16:19:26.840 回答