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


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

Je sais que PHP et les autres langages ont cette fonctionnalité mais ne peuvent pas trouver un bon moyen de le faire dans Ruby.

Que ferait-on dans cette situation?


34
2017-08-26 16:37


origine


Réponses:


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

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

68
2017-08-26 16:40



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"

16
2017-08-26 16:47



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

class Foo
  def foo
    # Do something
  end
end

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

11
2017-08-26 16:41



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

La syntaxe super.foo appeler la méthode foo dans la super classe est non supporté. Plutôt, il appellera le super-Méthode et sur le résultat retourné, essayez d'appeler 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

6
2017-08-31 22:33



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 tandis que super appelle le parent_method(méthode d'instance) de Parent.


1
2018-02-07 08:32