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éponses
Trop de publicités?Il n'y a pas de façon agréable de le faire, mais vous pouvez faire A.instance_method(:a).bind(self).call
qui fonctionnera, mais qui est laid.
Vous pouvez même définir votre propre méthode dans Object 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
Si vous n'avez pas explicitement besoin d'appeler A#a à partir de B#b, mais plutôt d'appeler A#a à partir de B#a, ce qui est effectivement ce que vous faites par le biais de B#b (à moins que votre exemple ne soit pas assez complet pour démontrer pourquoi vous appelez à partir de B#b, vous pouvez simplement appeler super à partir de B#a, comme cela est parfois fait dans les méthodes d'initialisation. Je sais que c'est assez évident, mais je voulais juste clarifier pour les nouveaux venus dans Ruby que vous n'avez pas besoin d'alias (ce que l'on appelle parfois un "around alias") dans tous les cas.
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