class A def a puts 'in #a' end end class B < A def a b() end def b # here i want to call A#a. end end
Répondre
class B < A
alias :super_a :a
def a
b()
end
def b
super_a()
end
end
Il n'y a pas de bonne façon de le faire, mais vous pouvez faire A.instance_method(:a).bind(self).call
, qui va fonctionner, mais est moche.
Vous pouvez même définir votre propre méthode objet pour agir comme super en java:
class SuperProxy
def initialize(obj)
@obj = obj
end
def method_missing(meth, *args, &blk)
@obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk)
end
end
class Object
private
def sup
SuperProxy.new(self)
end
end
class A
def a
puts "In A#a"
end
end
class B<A
def a
end
def b
sup.a
end
end
B.new.b # Prints in A#a
@klochner Je suis en désaccord, cette solution était exactement ce que je avais besoin ... raison: je voulais méthode super génériquement appel d'une méthode différente, mais sans la nécessité d'un seul alias tous que je voulais être en mesure pour ce faire, donc une façon générique d'invoquer super est très utile –
Compliqué pour définir une fois, simple de l'appeler beaucoup de fois. C'est mieux que l'inverse. – nertzy
Si vous n'avez pas besoin explicitement appeler A # A # B de b, mais plutôt besoin pour appeler A # a de B # a, ce qui est effectivement ce que vous faites par B # b (à moins que votre exemple ne soit pas assez complet pour démontrer pourquoi vous appelez de B # b, vous pouvez juste appel super à partir de B # a, comme c'est parfois fait dans les méthodes initialize.Je sais que c'est un peu évident, je voulais juste clarifier pour les nouveaux arrivants Ruby que vous n'avez pas à alias (en particulier, cela est parfois appelé un "alias autour") dans tous les cas e.
class A
def a
# do stuff for A
end
end
class B < A
def a
# do some stuff specific to B
super
# or use super() if you don't want super to pass on any args that method a might have had
# super/super() can also be called first
# it should be noted that some design patterns call for avoiding this construct
# as it creates a tight coupling between the classes. If you control both
# classes, it's not as big a deal, but if the superclass is outside your control
# it could change, w/o you knowing. This is pretty much composition vs inheritance
end
end
- 1. Invoke méthode dans une autre classe
- 2. Appeler une méthode de classe dans une classe
- 3. Que signifie "méthode de classe #" dans ruby?
- 4. Méthodes super classe en javascript
- 5. Python réflexion super classe
- 6. Puis-je appeler une méthode statique dans une autre méthode?
- 7. appels Ruby méthode déclarée dans le corps de la classe
- 8. Comment décorer une méthode dans une classe?
- 9. Pointeurs de méthode dans Ruby
- 10. Appelez une classe dans une autre classe en PHP
- 11. Le moment de l'appel de la méthode de la super classe est-il important dans ObjectiveC?
- 12. pourquoi uislider appelant une méthode deux fois?
- 13. C# Méthode appelant
- 14. appelant Varialble d'un autre événement
- 15. Quand une classe Ruby n'est-elle pas une classe Ruby?
- 16. Méthode reloadData non appelée d'une autre classe
- 17. méthode abstraite dans une classe virtuelle
- 18. Méthode vide dans une classe abstraite
- 19. Méthode générique dans une classe non générique?
- 20. Accès à la méthode dans Ruby
- 21. Pourquoi ne puis-je pas appeler une méthode publique dans une autre classe?
- 22. Utilisation d'un ActionListener dans une classe pour démarrer un timer dans une autre classe
- 23. Appeler méthode de classe de base de la méthode surchargée dans la sous-classe
- 24. iframe appelant la fonction javascript dans un autre iframe?
- 25. 'Object' classe nommée dans Ruby
- 26. p méthode dans Ruby difficile de rechercher
- 27. avec la méthode gridview appelant
- 28. défini? méthode dans Ruby and Rails
- 29. Déterminer si une méthode existe dans une classe statique
- 30. Passage d'une méthode à une autre méthode
Pour alias une méthode de classe, voir http://stackoverflow.com/questions/2925016/alias-method-and-class-methods-dont-mix –
Est-il possible que 'alias' ait été renommé en [' alias_method'] (http://apidock.com/ruby/Module/alias_method) depuis que cette réponse a été écrite? –
@JaredBeck il a vraiment été renommé. Alors maintenant, il devrait être: alias_method: super_a: un –