2010-07-12 10 views
10

io ancora non riesco a capire come fare un costruttore della sottoclasse seguire suo padre ...
esempio:Eredita il metodo initialize() in 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 

voglio fare ScraperA seguire il suo comportamento costruttore genitore,
che è istanziare un oggetto Mechanize senza me ridigitare Mechanize.new in metodo ScraperA initialize(). È possibile ?

Voglio solo seguire il principio ASCIUTTO ma il rubino rende difficile per me ???
Spero di no, forse è solo la mia ignoranza. In attesa di una soluzione semplice, Tnx.

Edit:
si scopre che avevo il metodo() in ScraperA, che ignorare l'inizializzazione di default initialize vuota(). Quindi sì, l'esempio funziona, perché non ci sono metodi di inizializzazione vuoti. Scusate per la mia stupidità. Tnx.

+0

Il codice funziona come desiderato. Se hai provato a eseguire esattamente quel codice, probabilmente è perché stai usando una versione obsoleta di ruby. – Adrian

+0

@Adrian: Non penso che ci sia alcuna versione di ruby ​​in cui ciò non funziona. – sepp2k

+3

Perché è stato chiuso come "troppo localizzato"? – 0112

risposta

27

Umm ... eh? Sì lo fa ... Check this out:

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

class B < A 
    def to_s 
    @a 
    end 
end 

puts B.new 
# "foo" is printed 

Questo funziona perché initialize è ereditata, proprio come qualsiasi altro metodo. Se si sostituisce con con un nuovo sub-initialize, smette di funzionare. Quindi è possibile utilizzare esplicitamente lo super per chiamare il numero initialize del genitore.

12

Questo dovrebbe funzionare ...

class ScraperA < Scraper 

    def initialize 
    super 

    # do other stuff here if necessary 
    end 

end 

... se si vuole avere altra logica per la sottoclasse. Come dicono i commenti se il costruttore è esattamente lo stesso della classe genitore il tuo codice originale dovrebbe funzionare bene.

Problemi correlati