2010-12-29 15 views
15

¿Es posible hacer algo como super.super en el método modificado? Es decir, para eludir el súper padre directo y llamar super "abuelo"Llamando al súper método de super

+0

... No puedo evitar pensar que esta pregunta es, de hecho, una canción de [They Might Be Giants] ... (http://en.wikipedia.org/wiki/They_Might_Be_Giants) ... Oo ... .lo siento. –

+7

Entonces, básicamente, ¿quieres un método 'superduper'? :) –

Respuesta

19

esto no es recomendable, pero lo que quiere es posible de esta manera:

grandparent = self.class.superclass.superclass 
meth = grandparent.instance_method(:the_method) 
meth.bind(self).call 

Esto funciona por conseguir primero la clase abuelo, a continuación, llamar instance_method en él para obtener un UnboundMethod que representa la versión del abuelo de the_method. Luego usa UnboundMethod#bind y Method#call para llamar al método del abuelo en el objeto actual.

-1

Considerando que esto está rompiendo uno de los principios de OOP (encapsulación), espero sinceramente que no sea posible. Incluso el caso de que intente hacer esto habla de un problema con su diseño.

+0

Cierto, tenía curiosidad, ya que todo parece posible en Ruby. – Vincent

+1

Lo siento, pero ¿has oído hablar de los diamantes de herencia? Así es como se pueden resolver en Ruby. Así que no hagamos diamantes de herencia, o cambiemos a Ruby para acomodarlos, se podría decir. No discutiré. Lo que dices puede ser válido en el mundo ideal. Pero en el mundo real, está trabajando con el código escrito por programadores incorrectos, que debe conectar entre sí sin tener el derecho de modificarlo. Y esto es para lo que son estos destornilladores. –

0

puede modificar los argumentos del método para permitir algún tipo de parámetro opcional 'pasar a principal'. en la clase superior de su hijo, verifique este parámetro y, de ser así, llame a super desde ese método y devuelva, de lo contrario, permita que continúe la ejecución.

class Grandparent; def method_name(opts={}); puts "Grandparent called."; end; end 
class Parent < Grandparent 
def method_name(opts={}) 
    return super if opts[:grandparent] 
    # do stuff otherwise... 
    puts "Parent called." 
end 
end 
class Child < Parent 
def method_name(opts={}) 
    super(:grandparent=>true) 
end 
end 

ruby-1.9.2-p0 > Child.new.method_name 
Grandparent called. 
    => nil 

de otro modo estoy de acuerdo con @Femaref, simplemente b/c algo es posible no significa que sea una buena idea. reconsidera tu diseño si crees que es necesario.

Cuestiones relacionadas