Menu
Coddy logo textTech

Chiamare super

Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 24 di 57.

All'interno di un metodo sovrascritto, super chiama la versione dello stesso metodo della superclasse. La sottoclasse può basarsi sul risultato invece di ripeterlo:

class Greeter
  def greet(name)
    "Hello, #{name}"
  end
end

class LoudGreeter < Greeter
  def greet(name)
    super.upcase + "!"
  end
end

puts LoudGreeter.new.greet("Ada")

Output:

HELLO, ADA!

L’uso più comune è initialize: la sottoclasse riceve un valore aggiuntivo, passa quelli condivisi alla superclasse con super(...) e memorizza il proprio:

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}"

Output:

Ada, 20, MIT

Le tre forme differiscono per ciò che passano. super da solo passa gli stessi argomenti ricevuti dal metodo corrente; super() non ne passa nessuno; super(a, b) passa esattamente quelli:

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)

Output:

Base got [1, 2] | Base got [] | Base got [2]

super può essere eseguito ovunque nel metodo, oppure solo in determinate condizioni. Quando initialize della sottoclasse accetta argomenti diversi da quelli del suo genitore, super senza argomenti passa quelli sbagliati, causando un comune ArgumentError:

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")

Output:

LOG started
LOG done
challenge icon

Sfida

Facile

Completa le classi. Person memorizza name e age, e il suo to_s restituisce Ada (36). Student aggiunge una scuola: il suo initialize passa il nome e l’età a super e il suo to_s restituisce Ada (20), studies at MIT, costruito a partire da super. Teacher aggiunge una materia allo stesso modo e restituisce Bo (45), teaches maths.

Il codice fornito legge righe person Ada 36, student Ada 20 MIT oppure teacher Bo 45 maths e stampa ogni oggetto.

Il tuo codice va inserito in person.rb, student.rb e teacher.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

require_relative 'person'
require_relative 'student'
require_relative 'teacher'

# Supplied input/output code: keep it as it is
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Ruby online