47 votes

appeler une autre méthode dans la super classe en ruby

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

81voto

Beffa Points 697
class B < A

  alias :super_a :a

  def a
    b()
  end
  def b
    super_a()
  end
end

30voto

sepp2k Points 157757

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

1voto

kernelsmith Points 81

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X