2010-07-12 81 views
10

我仍然無法弄清楚如何使一個子類的構造遵循其父...
例如:在ruby中繼承initialize()方法?

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。

+0

您的代碼按照您的要求工作。如果您已經嘗試完全運行該代碼,可能是因爲您使用的是過時的Ruby版本。 – Adrian 2010-07-12 15:47:09

+0

@Adrian:我認爲沒有任何版本的ruby無法正常工作。 – sepp2k 2010-07-12 15:48:13

+3

這是爲什麼關閉爲'太本地化'? – 0112 2014-09-11 23:11:14

回答

27

嗯......呃?是的,它不...檢查了這一點:

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

12

這應該工作...

class ScraperA < Scraper 

    def initialize 
    super 

    # do other stuff here if necessary 
    end 

end 

...如果你想爲子類的其他邏輯。正如註釋所說,如果構造函數與父類完全相同,那麼原始代碼應該可以正常工作。