2010-07-12 14 views
10

Todavía no puedo encontrar la manera de hacer un constructor de la subclase siga su padre ...
ejemplo:¿Heredar el método initialize() en 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 

Quiero hacer ScraperA seguir su comportamiento constructor de los padres,
que es crear una instancia de un objeto Mecanizado sin volver a escribir Mechanize.new en Método ScraperA initialize(). Es posible ?

¿Solo quiero seguir el principio DRY pero el rubí hace que sea difícil para mí ???
Espero que no, tal vez es solo mi ignorancia. Esperando una solución simple, Tnx.

Editar:
resulta que el método() en ScraperA, que anula la inicialización por defecto tuve initialize vacía(). Así que sí, el ejemplo está funcionando, porque no hay un método de inicialización vacío allí. Lo siento por mi estupidez. Tnx.

+0

Su código funciona como usted lo desea. Si ha intentado ejecutar ese código exactamente, es probable que sea porque está usando una versión obsoleta de ruby. – Adrian

+0

@Adrian: No creo que haya ninguna versión de ruby ​​en la que eso no funcione. – sepp2k

+3

¿Por qué se cerró esto como 'Demasiado localizado'? – 0112

Respuesta

27

Umm ... eh? Sí sí ... Mira esto:

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

class B < A 
    def to_s 
    @a 
    end 
end 

puts B.new 
# "foo" is printed 

Esto funciona porque initialize se hereda, al igual que cualquier otro método. Si anula teniendo un nuevo sub- initialize, deja de funcionar. Luego puede usar explícitamente super para llamar al initialize del padre.

12

Esto debería funcionar ...

class ScraperA < Scraper 

    def initialize 
    super 

    # do other stuff here if necessary 
    end 

end 

... si usted quiere tener otra lógica para la subclase. Como dicen los comentarios, si el constructor es exactamente el mismo que para la clase principal, su código original debería funcionar bien.

Cuestiones relacionadas