Llamar a super
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 24 de 57.
Dentro de un método sobrescrito, super llama a la versión del mismo método de la superclase. La subclase puede basarse en el resultado en lugar de repetirlo:
class Greeter
def greet(name)
"Hello, #{name}"
end
end
class LoudGreeter < Greeter
def greet(name)
super.upcase + "!"
end
end
puts LoudGreeter.new.greet("Ada")Salida:
HELLO, ADA!El uso más común es initialize: la subclase toma un valor adicional, pasa los valores compartidos a la superclase con super(...) y almacena el suyo:
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}"Salida:
Ada, 20, MITLas tres formas se diferencian en lo que pasan. super sin argumentos pasa los mismos argumentos que recibió el método actual; super() no pasa ninguno; super(a, b) pasa exactamente esos:
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)Salida:
Base got [1, 2] | Base got [] | Base got [2]super puede ejecutarse en cualquier parte del método, o solo bajo una condición. Cuando el initialize de la subclase recibe argumentos distintos de los de su clase padre, super sin argumentos pasa los argumentos equivocados, lo que provoca un ArgumentError común:
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")Salida:
LOG started
LOG doneDesafío
FácilCompleta las clases. Person almacena name y age, y su to_s devuelve Ada (36). Student añade una escuela: su initialize pasa el nombre y la edad a super, y su to_s devuelve Ada (20), studies at MIT, creado a partir de super. Teacher añade una asignatura de la misma manera y devuelve Bo (45), teaches maths.
El código proporcionado lee las líneas person Ada 36, student Ada 20 MIT o teacher Bo 45 maths e imprime cada objeto.
Tu código va en person.rb, student.rb y teacher.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'person'
require_relative 'student'
require_relative 'teacher'
# Código de entrada/salida suministrado: mantenlo tal como está
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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online