Интересно, есть ли способ не жестко кодировать имена классов childImporter и parentImporter, а использовать ссылку на родительский класс, например, имея
schema = PARENTCLASS.schema.deep_merge({
вместо
schema = parentImporter.schema.deep_merge({
Метод, который вы ищете: superclass
- он возвращает родительский класс получателя. Внутри тела класса или метода класса вы можете вызвать его без явного получателя:
class ParentImporter
def self.infos
{ name: 'Parent Importer', type: 'Importer' }
end
end
class ChildImporter < ParentImporter
def self.infos
superclass.infos.merge(name: 'Child Importer')
end
end
ParentImporter.infos #=> {:name=>"Parent Importer", :type=>"Importer"}
ChildImporter.infos #=> {:name=>"Child Importer", :type=>"Importer"}
Но есть еще более простой способ. Классы наследуют как методы класса, так и методы экземпляра от своего родительского класса. И в обоих вариантах вы можете просто вызвать super
, чтобы вызвать реализацию родителя:
class ChildImporter < ParentImporter
def self.infos
super.merge(name: 'Child Importer')
end
end
ParentImporter.infos #=> {:name=>"Parent Importer", :type=>"Importer"}
ChildImporter.infos #=> {:name=>"Child Importer", :type=>"Importer"}
Кроме того, вы можете запомнить значения, чтобы они не создавались заново. каждый раз при вызове методов:
class ParentImporter
def self.infos
@infos ||= { name: 'Parent Importer', type: 'Importer' }
end
end
class ChildImporter < ParentImporter
def self.infos
@infos ||= super.merge(name: 'Child Importer')
end
end
Эти @infos
являются так называемыми переменными экземпляра класса , т.е. переменными экземпляра в области видимости объекта (ов) класса. Они ведут себя точно так же, как переменные экземпляра в случайных экземплярах. В частности, нет никакой связи между @infos
в ParentImporter
и тем в ChildImporter
.
или
super(params,THISCLASS.schema)
вместо
super(params,childImporter.schema).
Чтобы получить класс объекта, вы можете вызвать его метод class
:
importer = ChildImporter.new
importer.class #=> ChildImporter
importer.class.infos #=> {:name=>"Child Importer", :type=>"Importer"}
То же самое работает внутри метода экземпляра:
def initialize(params = {})
super(params, self.class.schema)
end
Обратите внимание, что метод class
всегда должен вызываться с явным получателем. Пропуск получателя и просто запись class.schema
приводит к ошибке.
Примечание: я бы вообще не использовал переменные класса @@
. Просто вызовите методы вашего класса.