在Ruby中抽象/基因化类层次结构变量

时间:2013-03-12 16:10:27

标签: ruby

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

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,所有这些我想拥有这个功能。

我可以让他们都从一个超类中继承,这个超类有一个他们可以利用的通用版本,所以我不需要为每个类重新实现很多东西吗?

1 个答案:

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