是的,您可以从同一个超类继承,也可以使用模块和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