Menu
Coddy logo textTech

Redéfinition des méthodes

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 23 sur 57.

Une sous-classe peut redéfinir une méthode en en définissant une portant le même nom. Ruby recherche d'abord une méthode dans la propre classe de l'objet, et seulement ensuite dans la superclasse ; la version de la sous-classe est donc prioritaire :

class Animal
  def speak
    "..."
  end
end

class Dog < Animal
  def speak
    "Woof"
  end
end

class Fish < Animal
end

puts Dog.new.speak
puts Fish.new.speak

Sortie :

Woof
...

Une méthode de superclasse qui appelle une autre méthode utilise la version redéfinie pour les objets de la sous-classe. La méthode commune n’est écrite qu’une seule fois, et chaque sous-classe ne modifie que la partie qui diffère :

class Animal
  def initialize(name)
    @name = name
  end

  def introduce
    "#{@name} says #{speak}"
  end

  def speak
    "..."
  end
end

class Cat < Animal
  def speak
    "Meow"
  end
end

puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduce

Sortie :

Tom says Meow
Thing says ...

Redéfinir to_s dans une sous-classe modifie la façon dont seule cette sous-classe s’affiche. Les méthodes qu’elle ne redéfinit pas proviennent toujours de la superclasse :

class Item
  def initialize(name, price)
    @name = name
    @price = price
  end

  def to_s
    format("%s %.2f", @name, @price)
  end
end

class SaleItem < Item
  def to_s
    format("%s %.2f (sale)", @name, @price * 0.8)
  end
end

puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)

Sortie :

Lamp 20.00
Lamp 16.00 (sale)

L’ordre dans lequel Ruby effectue ses recherches correspond aux ancêtres de la classe : la classe elle-même, puis sa superclasse, et ainsi de suite jusqu’à Object. La première classe de cette liste qui définit la méthode la fournit :

class Animal
  def speak
    "..."
  end
end

class Dog < Animal
  def speak
    "Woof"
  end
end

class Puppy < Dog
end

puts Puppy.new.speak
p Puppy.ancestors.take(3)

Sortie :

Woof
[Puppy, Dog, Animal]
challenge icon

Défi

Facile

Complétez les classes de paie. Employee stocke un name et possède pay(hours), qui renvoie hours * 20, ainsi que payslip(hours), qui renvoie Ada: 800 en utilisant pay. Manager redéfinit pay avec une valeur fixe de 1500, quelles que soient les heures. Intern redéfinit pay avec hours * 12, mais avec un maximum de 300. payslip est défini uniquement dans Employee.

Le code fourni lit des lignes telles que employee Ada 40, manager Bo 50 ou intern Cy 20, crée l’objet correspondant et affiche son bulletin de paie, puis affiche la rémunération totale.

Votre code doit se trouver dans employee.rb, manager.rb et intern.rb. main.rb contient le code fourni d’entrée/sortie et ne peut pas être modifié.

Essayez vous-même

require_relative 'employee'
require_relative 'manager'
require_relative 'intern'

# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
  input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
  kind, name, hours = line.split
  worker = kinds[kind].new(name)
  puts worker.payslip(hours.to_i)
  total += worker.pay(hours.to_i)
end
puts "total: #{total}"
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