在ruby中继承initialize()方法?

mhd*_*mhd 13 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
Run Code Online (Sandbox Code Playgroud)

我想ScraperA遵循它的父构造函数行为,
即在没有Mechanize.new在ScraperA initialize()方法中重新输入的情况下实例化一个Mechanize对象 .这可能吗 ?

只是想遵循DRY原则,但红宝石让我很难???
希望不是,也许这只是我的无知.期待简单的解决方案,Tnx.

编辑:
事实证明我在ScraperA中有空的initialize()方法,它覆盖默认的initialize().所以是的,这个例子正在工作,因为那里没有空的初始化方法.抱歉我的愚蠢.TNX.

Ama*_*dan 32

嗯......呃?是的,确实......看看这个:

class A
  def initialize
    @a = "foo"
  end
end

class B < A
  def to_s
    @a
  end
end

puts B.new
# "foo" is printed
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它initialize是继承的,就像任何其他方法一样.如果你通过新的子程序覆盖initialize,它就会停止工作.然后你可以明确地super用来调用父母的initialize.


Dan*_*man 14

这应该工作......

class ScraperA < Scraper

  def initialize
    super

    # do other stuff here if necessary
  end

end
Run Code Online (Sandbox Code Playgroud)

...如果你想为子类提供其他逻辑.正如评论所说,如果构造函数与父类完全相同,那么原始代码应该可以正常工作.