Appeler super
Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 24 sur 57.
Dans une méthode redéfinie, super appelle la version de la même méthode définie dans la superclasse. La sous-classe peut s’appuyer sur le résultat au lieu de le répéter :
class Greeter
def greet(name)
"Hello, #{name}"
end
end
class LoudGreeter < Greeter
def greet(name)
super.upcase + "!"
end
end
puts LoudGreeter.new.greet("Ada")Sortie :
HELLO, ADA!L’utilisation la plus courante est initialize : la sous-classe prend une valeur supplémentaire, transmet les valeurs partagées à la super-classe avec super(...) et stocke la sienne :
class Person
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
class Student < Person
attr_reader :school
def initialize(name, age, school)
super(name, age)
@school = school
end
end
s = Student.new("Ada", 20, "MIT")
puts "#{s.name}, #{s.age}, #{s.school}"Résultat :
Ada, 20, MITLes trois formes diffèrent par ce qu’elles transmettent. super sans arguments transmet les mêmes arguments que ceux reçus par la méthode actuelle ; super() n’en transmet aucun ; super(a, b) transmet exactement ceux-ci :
class Base
def show(*args)
"Base got #{args.inspect}"
end
end
class Child < Base
def show(a, b)
[super, super(), super(b)].join(" | ")
end
end
puts Child.new.show(1, 2)Sortie :
Base got [1, 2] | Base got [] | Base got [2]super peut s’exécuter n’importe où dans la méthode, ou uniquement sous une condition. Lorsque le initialize de la sous-classe accepte des arguments différents de ceux de sa classe parente, un super nu transmet les mauvais arguments, ce qui provoque fréquemment une ArgumentError :
class Logger
def log(message)
puts "LOG #{message}"
end
end
class QuietLogger < Logger
def log(message)
super unless message.start_with?("debug")
end
end
logger = QuietLogger.new
logger.log("started")
logger.log("debug x=1")
logger.log("done")Sortie :
LOG started
LOG doneDéfi
FacileComplétez les classes. Person stocke name et age, et son to_s renvoie Ada (36). Student ajoute une école : son initialize transmet le nom et l’âge à super, et son to_s renvoie Ada (20), studies at MIT, construit à partir de super. Teacher ajoute une matière de la même manière et renvoie Bo (45), teaches maths.
Le code fourni lit les lignes person Ada 36, student Ada 20 MIT ou teacher Bo 45 maths et affiche chaque objet.
Votre code doit être placé dans person.rb, student.rb et teacher.rb. main.rb contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
require_relative 'person'
require_relative 'student'
require_relative 'teacher'
# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name, age, extra = line.split
person = case kind
when "student" then Student.new(name, age.to_i, extra)
when "teacher" then Teacher.new(name, age.to_i, extra)
else Person.new(name, age.to_i)
end
puts person
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Compilateur Ruby en ligne