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?
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
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"
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
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
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
.