Menu
Coddy logo textTech

Methoden überschreiben

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 23 von 57.

Eine Unterklasse kann eine Methode überschreiben, indem sie eine Methode mit demselben Namen definiert. Ruby sucht zuerst in der eigenen Klasse des Objekts nach einer Methode und erst danach in der Oberklasse, daher hat die Version der Unterklasse Vorrang:

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

Ausgabe:

Woof
...

Eine Methode der Oberklasse, die eine andere Methode aufruft, verwendet für Objekte von Unterklassen die überschriebene Version. Die gemeinsame Methode wird einmal geschrieben, und jede Unterklasse ändert nur den abweichenden Teil:

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

Ausgabe:

Tom says Meow
Thing says ...

Das Überschreiben von to_s in einer Unterklasse ändert, wie nur diese Unterklasse ausgegeben wird. Methoden, die sie nicht überschreibt, stammen weiterhin aus der Oberklasse:

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)

Ausgabe:

Lamp 20.00
Lamp 16.00 (sale)

Die Reihenfolge, in der Ruby sucht, sind die Vorfahren der Klasse: die Klasse selbst, dann ihre Oberklasse und so weiter bis zu Object. Die erste Klasse in dieser Liste, die die Methode definiert, stellt sie bereit:

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)

Ausgabe:

Woof
[Puppy, Dog, Animal]
challenge icon

Aufgabe

Einfach

Vervollständige die Gehaltsklassen. Employee speichert einen name und verfügt über pay(hours), das hours * 20 zurückgibt, sowie über payslip(hours), das mithilfe von pay Ada: 800 zurückgibt. Manager überschreibt pay mit einem festen Wert von 1500, unabhängig von der Stundenzahl. Intern überschreibt pay mit hours * 12, jedoch höchstens 300. payslip ist nur in Employee definiert.

Der bereitgestellte Code liest Zeilen wie employee Ada 40, manager Bo 50 oder intern Cy 20, erstellt das passende Objekt und gibt dessen Gehaltsabrechnung aus. Anschließend gibt er die Gesamtvergütung aus.

Dein Code gehört in employee.rb, manager.rb und intern.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

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

# Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler