Похоже, вы создаете систему для написания расширений для программного обеспечения.Поскольку все классы расширения, вероятно, все в некотором роде похожи, например, совместно используют некоторые общие методы, возможно, имеет смысл иметь базовый класс с именем Extension
, от которого наследуются все классы расширения.Это очень полезно для указанной проблемы, потому что когда пользователь наследует ваш класс, вы можете обнаружить его и добавить подкласс в список.Вот некоторые доказательства концепции кода:
class Extension
class << self
attr_reader :list
end
@list = []
def self.inherited(klass)
@list << klass.new
end
end
# The MyExt class would be in another file, loaded by require.
class MyExt < Extension
end
p Extension.list # => [#<MyExt:0xb777d884>]
Если вы по какой-то причине не хотите использовать подклассы, то столь же легко сделать Extension
модулем и использовать вместо него included
hookиз inherited
.
Лично я бы просто убрал вызов .new
, потому что не вижу причин для создания экземпляра класса сразу, но это зависит от вас.Я бы просто сохранил список классов.