Menu
Coddy logo textTech

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, MIT

Les 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 done
challenge icon

Défi

Facile

Complé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
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Ruby en ligne