Menu
Coddy logo textTech

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

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

Desafío

Fácil

Completa 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
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Ruby online