在ruby中继承initialize()方法?

时间:2010-07-12 15:43:02

标签: 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.new的情况下实例化一个Mechanize对象 ScraperA initialize()方法。这可能吗?

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

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

2 个答案:

答案 0 :(得分:29)

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

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

class B < A
  def to_s
    @a
  end
end

puts B.new
# "foo" is printed

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

答案 1 :(得分:14)

这应该有用......

class ScraperA < Scraper

  def initialize
    super

    # do other stuff here if necessary
  end

end

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