2010-04-02 2 views
25

J'ai deux classes A et B. La classe B remplace la méthode foo de la classe A. La classe B a une méthode bar où je veux appeler la méthode foo de la super classe. Quelle est la syntaxe d'un tel appel? Pour les méthodes de classe, je peux appeler les méthodes vers le haut de la chaîne d'héritage en préfixant explicitement le nom de la classe. Je me demande s'il existe un idiome similaire pour les méthodes d'instance.Comment j'appelle une méthode super classe

class P 
def self.x 
    "x" 
end 
end 

class Q < P 
def self.x 
    super + " x" 
end 

def self.y 
    P.x 
end 
end 

Modifier Mon cas d'utilisation est générale. Pour un cas spécifique, je sais que je peux utiliser la technique alias. C'est une fonctionnalité courante en Java ou C++, donc je suis curieux de savoir s'il est possible de le faire sans ajouter de code supplémentaire.

+5

double: http: //stackoverflow.com/questions/1251178/calling-another-method-in-super-cla ss-in-ruby –

Répondre

5

Vous pouvez alias old_foo foo avant de le redéfinir pour conserver l'ancienne implémentation sous un nouveau nom. (Techniquement, il est possible de prendre l'implémentation d'une superclasse et de la lier à une instance d'une sous-classe, mais ce n'est pas idiomatique et probablement assez lent dans la plupart des implémentations.)

13

Dans ce cas particulier, vous pouvez juste alias :bar :foo avant def foo en class B pour renommer le vieux foo en bar, mais bien sûr, vous pouvez alias à n'importe quel nom que vous aimez et l'appeler à partir de cela. This question a d'autres façons de le faire plus bas dans l'arbre d'héritage.

22

Vous pouvez faire:

def bar 
    self.class.superclass.instance_method(:foo).bind(self).call 
end 
+22

Cela ne peut pas être le meilleur moyen d'appeler une méthode surchargée dans Ruby, s'il vous plaît dites que ce n'est pas le cas. Editer: oui le commentaire dans la question est lié à une meilleure option. – Vinnyq12

+3

@ Vinnyq12 Oui, 'alias' est meilleur pour un cas spécifique, quand vous connaissez la méthode que vous voulez appeler de superclasse; mais ici l'OP demande un cas général, sans devoir alias chaque méthode de superclasse. –

Questions connexes