Ist es möglich, etwas wie super.super
in der Overriven-Methode zu tun? Das heißt, die Supergroßmutter des direkten Elternteils zu umgehen und "Großeltern" -Super zu nennen?Aufruf Super-Super-Methode
Antwort
Dies ist nicht empfehlenswert, aber was Sie wollen, ist möglich wie folgt aus:
grandparent = self.class.superclass.superclass
meth = grandparent.instance_method(:the_method)
meth.bind(self).call
Dies funktioniert, indem zuerst die Großeltern Klasse bekommen, dann instance_method
forderte sie auf, eine UnboundMethod
zu bekommen als Vertreter der Großeltern-Version the_method
. Anschließend ruft es die Methoden UnboundMethod#bind
und Method#call
auf, um die Methode des Großelternteils für das aktuelle Objekt aufzurufen.
In Anbetracht dessen ist eines der Prinzipien der OOP (Kapselung) zu brechen, ich hoffe sehr, dass es nicht möglich ist. Selbst wenn Sie dies versuchen, spricht dies von einem Problem mit Ihrem Design.
Stimmt, ich war nur neugierig, da alles in Ruby möglich scheint. – Vincent
Es tut mir leid, aber haben Sie schon von Erbdiamanten gehört? So können sie in Ruby aufgelöst werden. Also lass uns keine Erbschaftsdiamanten machen, oder lass uns Ruby ändern, um sie unterzubringen, könnte man sagen. Ich werde nicht streiten. Was du sagst, könnte in der idealen Welt halten. Aber in der realen Welt arbeiten Sie mit dem Code von schlechten Programmierern, den Sie miteinander verbinden müssen, ohne das Recht zu haben, ihn zu modifizieren. Und dafür sind diese Schraubendreher da. –
Sie könnten die Argumente der Methode ändern, um eine Art von optionalen 'pass to parent' Parameter zu erlauben. Suchen Sie in der Superklasse Ihres Kindes nach diesem Parameter, und wenn dies der Fall ist, rufen Sie super von dieser Methode auf und geben Sie zurück, andernfalls können Sie die Ausführung fortsetzen.
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
sonst bin ich mit @Femaref, nur b/c etwas möglich ist, bedeutet nicht, es ist eine gute Idee. Überdenken Sie Ihr Design, wenn Sie dies für notwendig halten.
- 1. Effizienter Aufruf von Plugin nach AJAX-Aufruf
- 2. Aufruf verschiedene Abschnitte des Codes durch Aufruf
- 3. Aufruf zu undefined Methode in Facebook Aufruf zu PublishUserAction
- 4. Aufruf zweiten http Anruf nach dem ersten Aufruf http beenden
- 5. C++ Aufruf von Override-Funktionen führt zum Aufruf der Basisfunktion
- 6. jQuery Ajax-Aufruf zu ASP.NET Aufruf falsche Methode
- 7. Optionen Aufruf für Meta vor REST-API-Aufruf
- 8. Aufruf von didHighlightItemAtIndexPath ohne Aufruf von didSelectItemAtIndexPath für UICollectionView
- 9. Aufruf Destructor Ansatz Vergleich
- 10. EXC_BAD_ACCESS Aufruf eines Blocks
- 11. Aufruf der engsten Anpassungsmethode
- 12. Aufruf setterinterval mit Objektreferenz
- 13. PHP Aufruf Funktion AJAX
- 14. Aufruf einer Klasse dynamisch?
- 15. Aufruf der Servlet-Methode
- 16. Aufruf Methode aus Konstruktor
- 17. Xslt Aufruf java Instanzmethode
- 18. EXC_BAD_ACCESS beim Aufruf managedObjectContext
- 19. jQuery - Illegaler Aufruf
- 20. Ant Ziel Aufruf
- 21. Mockito- Aufruf echte Methode
- 22. Java Aufruf einer Methode
- 23. JavaScript-Aufruf gespeicherte Prozedur
- 24. Redundanter Aufruf von Object.ToString()
- 25. ajax Formulardaten: Illegale Aufruf
- 26. Aufruf fdopen: Bad Dateideskriptors
- 27. JavaScript-Aufruf von String
- 28. Inhaltstyp in HTTP-Aufruf
- 29. Aufruf Methoden in JSF
- 30. Aufruf von C++ - Funktionen
... Ich kann mir nicht helfen, aber diese Frage ist in der Tat ein Lied von [They Might Be Giants] (http://en.wikipedia.org/wiki/They_Might_Be_Giants) ... Oo .. .Es tut uns leid. –
Also im Grunde willst du eine 'superduper' Methode? :) –