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 に答える