Наследовать метод initialize() в ruby?
Я до сих пор не могу понять, как создать конструктор подкласса, следуя за его родителем...
Пример:
require 'mechanize'
class Scraper
attr_accessor :agent
def initialize
# I dont know if using instance variable is the right thing to do
@agent = Mechanize.new
end
end
class ScraperA < Scraper
end
Я хочу, чтобы ScraperA
выполнял поведение родительского конструктора,
то есть
создать экземпляр объекта Mechanize без переименования Mechanize.new
в
Метод scraperA initialize(). Возможно ли это?
Просто хочу следовать принципу DRY, но рубин мне тяжело?
Надеюсь, что это не просто мое невежество.
В ожидании простого решения, Tnx.
Изменить:
оказывается, что у меня был пустой метод initialize() в ScraperA, который переопределяет значение по умолчанию
инициализации().
Итак, да, пример работает, потому что там нет пустого метода инициализации.
Извините за мою глупость.
Tnx.
Ответы
Ответ 1
Умм... а? Да, это так... Проверьте это:
class A
def initialize
@a = "foo"
end
end
class B < A
def to_s
@a
end
end
puts B.new
# "foo" is printed
Это работает, потому что initialize
наследуется, как и любой другой метод. Если вы переопределите его, получив новый sub initialize
, он перестанет работать. Затем вы можете явно использовать super
для вызова родительского initialize
.
Ответ 2
Это должно работать...
class ScraperA < Scraper
def initialize
super
# do other stuff here if necessary
end
end
... если вы хотите иметь другую логику для подкласса. Как говорится в комментариях, если конструктор точно такой же, как для родительского класса, ваш исходный код должен работать нормально.