2010-07-12 6 views
10

Je ne peux toujours pas comprendre comment faire un constructeur de sous-classe suit son parent ...
exemple:Hériter de la méthode initialize() dans 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 

Je veux faire ScraperA suivre son comportement constructeur parent,
qui est instanciez un objet Mechanize sans me retapant Mechanize.new dans ScraperA méthode initialize(). Est-ce possible ?

Je veux juste suivre le principe DRY mais ruby ​​le rend difficile pour moi ???
J'espère que non, peut-être que c'est juste mon ignorance. Dans l'attente d'une solution simple, Tnx.

Edit:
il se trouve que j'ai eu méthode initialize vide() dans ScraperA, ce qui annule l'initialisation par défaut (). Alors ouais l'exemple fonctionne, parce qu'il n'y a pas de méthode d'initialisation vide. Désolé pour ma stupidité. Tnx.

+0

Votre code fonctionne comme vous le souhaitez. Si vous avez essayé d'exécuter ce code exactement, c'est probablement parce que vous utilisez une version obsolète de ruby. – Adrian

+0

@Adrian: Je ne pense pas qu'il existe une version de ruby ​​où cela ne fonctionne pas. – sepp2k

+3

Pourquoi était-ce fermé comme «trop localisé»? – 0112

Répondre

27

Umm ... hein? Oui, il ne ... 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 

Cela fonctionne parce que initialize est hérité, comme toute autre méthode. Si vous surchargez en ayant un nouveau sous-initialize, il cesse de fonctionner. Vous pouvez ensuite utiliser explicitement super pour appeler le parent initialize.

12

Cela devrait fonctionner ...

class ScraperA < Scraper 

    def initialize 
    super 

    # do other stuff here if necessary 
    end 

end 

... si vous voulez avoir une autre logique pour la sous-classe. Comme les commentaires disent si le constructeur est exactement le même que pour la classe parente, votre code original devrait fonctionner correctement.

Questions connexes