¿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
Respuesta
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.
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.
Cierto, tenía curiosidad, ya que todo parece posible en Ruby. – Vincent
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. –
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.
- 1. Llamando al método de clase super super
- 2. onCreateOptionsMenu() llamando al super
- 3. Ruby/RoR: llamando al método original a través de super()?
- 4. Llamando al método WriteableBitmap.WritePixels
- 5. Llamando super constructor en C#
- 6. llamando al método en xCode
- 7. ¿Qué hace el método super()?
- 8. ¿Cuándo NO llamar al método super() al anular?
- 9. ¿Cuándo llama al método super en viewWillAppear, viewDidDisappear, etc ...?
- 10. Llamar a un método súper en PHP
- 11. Python súper método y piden alternativas
- 12. Llamando al método getIntent en el servicio
- 13. Llamando al método Bean administrado desde JavaScript
- 14. ¿Llamando al método estático en una clase?
- 15. Llamando al método Win32 API desde Java
- 16. ¿Llamando al método BHO desde Javascript?
- 17. Llamando al método original con Moq
- 18. .Contains() método no llamando Ignorar Igual al método
- 19. ¿Está bien llamar a [super loadView]?
- 20. método debe llamar al error super() en Netbeans
- 21. Llamando al método de clase hijo del padre
- 22. Llamando al método C# dentro de un programa Java
- 23. Llamando al método Java vararg de Scala con primitivas
- 24. Llamando al método genérico con el tipo de variable
- 25. Llamando al método reemplazado de la clase base en C#
- 26. si (auto = [súper init]) vs. if ((auto = [súper init]))
- 27. Llamando al método de clase base desde el método sobrecargado en la subclase
- 28. Entender el "yo" y configurar uno mismo al súper
- 29. Java:. Cómo llamar a super() super() en el método reemplazado (método abuelos)
- 30. Jerarquía de llamadas al método Ruby
... 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. –
Entonces, básicamente, ¿quieres un método 'superduper'? :) –