È possibile fare qualcosa come super.super
nel metodo sovrascritto? Cioè, per bypassare il super genitore diretto e chiamare super "nonni"?Chiamare il super metodo di super
risposta
questo non è consigliato, ma ciò che si vuole è possibile in questo modo:
grandparent = self.class.superclass.superclass
meth = grandparent.instance_method(:the_method)
meth.bind(self).call
Questo funziona attraverso il collegamento della classe nonno, quindi chiamando instance_method
su di esso per ottenere una UnboundMethod
che rappresenta la versione del nonno di the_method
. Quindi utilizza UnboundMethod#bind
e Method#call
per chiamare il metodo del nonno sull'oggetto corrente.
Considerando che questo sta infrangendo uno dei principi di OOP (incapsulamento), spero che non sia possibile. Anche il caso in cui tu stia cercando di farlo parla di un problema con il tuo design.
Vero, ero solo curioso dal momento che tutto sembra possibile in Ruby. – Vincent
Mi dispiace, ma hai sentito parlare dei diamanti ereditari? Ecco come possono essere risolti in Ruby. Quindi non facciamo diamanti ereditari, o cambiamo Ruby per accontentarli, si potrebbe dire. Non discuterò. Quello che dici potrebbe valere nel mondo ideale. Ma nel mondo reale, stai lavorando con il codice scritto da programmatori cattivi, che devi collegare insieme senza avere il diritto di modificarlo. E questo è ciò a cui servono questi cacciaviti. –
è possibile modificare gli argomenti del metodo per consentire un tipo di parametro facoltativo 'pass to parent'. nella super classe di tuo figlio, controlla questo parametro e, in tal caso, chiama super da quel metodo e ritorna, altrimenti permetti all'esecuzione di continuare.
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
altrimenti sono d'accordo con @Femaref, solo b/c qualcosa è possibile non significa che sia una buona idea. riconsiderare il tuo design se pensi che sia necessario.
- 1. differenza tra chiamare super e chiamare super()
- 2. Chiamare il metodo super nel controller sails.js
- 3. chiamata metodo di classe super super
- 4. Quando dovrei chiamare super?
- 5. util.inherits - come chiamare il metodo di super su istanza?
- 6. Devo chiamare [super init] o [super initWithCoder], ecc. Per NSObject
- 7. Quando chiamare Python super() .__ init __()?
- 8. Ereditarietà di Python: scegliere quale super() chiamare
- 9. Chiamare super costruttore in C#
- 10. Come chiamare un metodo Super Oracle PL/SQL
- 11. Devo sempre chiamare [super viewDidLoad] nel metodo -viewDidLoad?
- 12. chiamare un altro metodo in super classe in rubino
- 13. Argomenti Python super(): perché non super (obj)?
- 14. Chiamare super per cellForRowAtIndexPath in Swift
- 15. Perché chiamare super() in un costruttore?
- 16. dovrei chiamare [super superMethod] dopo il mio codice o prima?
- 17. delimitata metodo generico di tipo 'super'
- 18. chiamata metodo di classe Super automaticamente
- 19. Qual è il modo corretto per chiamare [super layoutsubviews]?
- 20. Parola chiave "super" nel metodo classe
- 21. chiamata metodo eccellente dall'interno super classe
- 22. onCreateOptionsMenu() chiama super
- 23. Quando si chiama il metodo super in viewWillAppear, viewDidDisappear, ecc ...?
- 24. L'attuale metodo Ruby viene chiamato tramite super?
- 25. L'implementazione di -layoutSubviews di CustomTableCellView deve chiamare super, NSInternalInconsistencyException
- 26. Differenza tra "super" e "super do | u |" utilizzando il contesto di Devise
- 27. Python 3, super .__ del __()
- 28. Symfony - Capire il super amministratore
- 29. Perché devo chiamare super -dialloc per ultimo, e non prima?
- 30. Python super() non credibile
... Non posso fare a meno di pensare che questa domanda sia, in effetti, una canzone di [They Might Be Giants] (http://en.wikipedia.org/wiki/They_Might_Be_Giants) ... Oo .. .scusa. –
Quindi, in pratica, vuoi un metodo 'superduper'? :) –