Menu
Coddy logo textTech

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

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

Aufgabe

Einfach

Vervollstä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
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