Обратите внимание, что ваши alias_method
и private
не были необходимы, поскольку new
, который вы обычно вызываете, Class#new
.Кроме того, нет причин использовать переменную класса (если вы не пытаетесь отслеживать создание подкласса в мастер-классе).Это работает так же хорошо, если не лучше:
class Foo
class << self; attr_reader :objs; end
def self.new(*a,&b)
super.tap{|o| (@objs||=[]) << o}
end
end
class Bar < Foo; end
2.times{ Foo.new }
3.times{ Bar.new }
p Foo.objs
#=> [#<Foo:0x2bb6260>, #<Foo:0x2ba2400>]
p Bar.objs
#=> [#<Bar:0x2ce6000>, #<Bar:0x2baf4e0>, #<Bar:0x2b94f40>]
Преимущество этого метода перед добавлением массива в вашем инициализаторе состоит в том, что вам не нужно помнить, чтобы вызывать super
в * 1009.* ваших подклассов.В самом деле, вам не нужно даже определять и initialize
в ваших подклассах.