web-dev-qa-db-fra.com

Méthode d’appel dans la classe parente à partir de méthodes de sous-classe dans Ruby

J'ai utilisé super pour initialiser la classe parent, mais je ne vois aucun moyen d'appeler la classe parent à partir de méthodes de sous-classes.

Je sais que PHP et d’autres langues ont cette fonctionnalité, mais ne trouvent pas un bon moyen de le faire en Ruby.

Que ferait-on dans cette situation?

48

Si la méthode porte le même nom, c’est-à-dire que vous redéfinissez une méthode, vous pouvez simplement utiliser super. Sinon, vous pouvez utiliser un alias_method ou une reliure.

class Parent
  def method
  end
end

class Child < Parent
  alias_method :parent_method, :method
  def method
    super
  end

  def other_method
    parent_method
    #OR
    Parent.instance_method(:method).bind(self).call
  end
end
82
Mark Meyer

Le super mot-clé appelle une méthode du même nom dans la super classe:

class Foo
  def foo
    "#{self.class}#foo"
  end
end

class Bar < Foo
  def foo
    "Super says: #{super}"
  end
end

Foo.new.foo # => "Foo#foo"
Bar.new.foo # => "Super says: Bar#foo"
18
maerics

Le mot clé super dans Ruby appelle en réalité une méthode du même nom dans la classe parente. ( source )

class Foo
  def foo
    # Do something
  end
end

class Bar < Foo
  def foo
    super # Calls foo() method in parent class
  end
end
14
Graham Swan

D'autres l'ont déjà bien dit. Juste une note de prudence supplémentaire:

La syntaxe super.foo appeler la méthode foo dans la super classe est non pris en charge. Plutôt, il appellera la méthode super et, sur le résultat renvoyé, appellera foo.

  class A
    def a
      "A::a"
    end
  end

  class B < A
    def a
      "B::a is calling #{super.a}" # -> undefined method `a` for StringClass 
    end
  end
8
Christopher Oezbek
class Parent
  def self.parent_method
    "#{self} called parent method"
  end

  def parent_method
    "#{self} called parent method"
  end
end

class Child < Parent

  def parent_method
    # call parent_method as
    Parent.parent_method                # self.parent_method gets invoked
    # call parent_method as
    self.class.superclass.parent_method # self.parent_method gets invoked
    super                               # parent_method gets invoked 
    "#{self} called parent method"      # returns "#<Child:0x00556c435773f8> called parent method"
  end

end

Child.new.parent_method  #This will produce following output
Parent called parent method
Parent called parent method
#<Child:0x00556c435773f8> called parent method
#=> "#<Child:0x00556c435773f8> called parent method"

self.class.superclass == Parent #=> true

Parent.parent_method et self.class.superclass appellera self.parent_method (méthode de classe) de Parent alors que super appelle le parent_method (méthode d'instance) de Parent.

3
Aravind Vemula