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, MITLe 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 doneSfida
FacileCompleta 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
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
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online