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.speakAusgabe:
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").introduceAusgabe:
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]Aufgabe
EinfachVervollstä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}"
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler