Comment dois-je appeler une super méthode de classe
J'ai deux classes A
, et B
. Classe B
remplace la foo
méthode de classe A
. Classe B
a un bar
méthode où je veux appeler la foo
méthode de la super-classe. Quelle est la syntaxe pour un tel appel?
class A
def foo
"hello"
end
end
class B < A
def foo
super + " world"
end
def bar
# how to call the `foo` method of the super class?
# something similar to
super.foo
end
end
Pour les méthodes de classe, je peux appeler les méthodes de la chaîne d'héritage explicitement en préfixant le nom de la classe. Je me demande si il est du même idiome pour les méthodes d'instance.
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 est général. Pour un cas spécifique, je sais que je peux utiliser alias
technique. C'est une caractéristique commune en Java ou en C++, donc je suis curieux de savoir si il est possible de le faire sans ajouter du code supplémentaire.
- Dupliquer: stackoverflow.com/questions/1251178/...
Vous devez vous connecter pour publier un commentaire.
En Ruby 2.2, vous pouvez utiliser
Method#super_method
maintenantPar exemple:
Ref: https://bugs.ruby-lang.org/issues/9781#change-48164 et https://www.ruby-forum.com/topic/5356938
Que vous pouvez faire:
alias
est mieux pour des cas spécifiques, lorsque vous savez que la méthode que vous voulez l'appeler à partir de la superclasse; mais ici l'OP demande pour un cas général, sans avoir à alias de chaque méthode de la superclasse.Dans ce cas particulier, vous pouvez simplement
alias :bar :foo
avantdef foo
dansclass B
de renommer l'ancienfoo
àbar
, mais bien sûr, vous pouvez alias pour un nom que vous aimez et l'appeler à partir de cela. Cette question a quelques autres façons de le faire plus bas dans l'arbre d'héritage.Vous pouvez
alias old_foo foo
avant de redéfinir pour garder la vieille mise en œuvre sous un nouveau nom. (Techniquement, il est possible de prendre une superclasse de la mise en œuvre et la lier à une instance d'une sous-classe, mais c'est hacky, pas du tout idiomatiques et probablement assez lent en plus de la mise en œuvre de démarrage.)Basé sur @Sony réponse.
Dans le cas où vous souhaitez appeler le
method
méthode sur certainsmy_object
et c'est déjà surchargée, quelque part, plusieurs classes supérieures (comme pour leNet::HTTPRequest#method
), au lieu de faire.superclass.superclass.superclass
utiliser le:Comme ceci: