super aufrufen
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 24 von 57.
Innerhalb einer überschreibenden Methode ruft super die Version derselben Methode aus der Oberklasse auf. Die Unterklasse kann auf dem Ergebnis aufbauen, anstatt es zu wiederholen:
class Greeter
def greet(name)
"Hello, #{name}"
end
end
class LoudGreeter < Greeter
def greet(name)
super.upcase + "!"
end
end
puts LoudGreeter.new.greet("Ada")Ausgabe:
HELLO, ADA!Die häufigste Verwendung ist initialize: Die Unterklasse übernimmt einen zusätzlichen Wert, übergibt die gemeinsamen Werte mit super(...) an die Oberklasse und speichert ihren eigenen:
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}"Ausgabe:
Ada, 20, MITDie drei Formen unterscheiden sich darin, was sie übergeben. Das allein stehende super übergibt dieselben Argumente, die die aktuelle Methode erhalten hat; super() übergibt keine; super(a, b) übergibt genau diese:
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)Ausgabe:
Base got [1, 2] | Base got [] | Base got [2]super kann überall in der Methode ausgeführt werden oder nur unter einer Bedingung. Wenn das initialize der Unterklasse andere Argumente als das der übergeordneten Klasse entgegennimmt, übergibt ein allein stehendes super die falschen Argumente, was häufig zu einem ArgumentError führt:
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")Ausgabe:
LOG started
LOG doneAufgabe
EinfachVervollständige die Klassen. Person speichert name und age, und sein to_s gibt Ada (36) zurück. Student fügt eine Schule hinzu: Sein initialize übergibt den Namen und das Alter an super, und sein to_s gibt Ada (20), studies at MIT zurück, erstellt aus super. Teacher fügt auf dieselbe Weise ein Fach hinzu und gibt Bo (45), teaches maths zurück.
Der bereitgestellte Code liest Zeilen wie person Ada 36, student Ada 20 MIT oder teacher Bo 45 maths und gibt jedes Objekt aus.
Dein Code gehört in person.rb, student.rb und teacher.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'person'
require_relative 'student'
require_relative 'teacher'
# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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
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