Sobrescritura de métodos
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 23 de 57.
Una subclase puede sobrescribir un método definiendo uno con el mismo nombre. Ruby busca primero un método en la propia clase del objeto y solo después en la superclase, por lo que prevalece la versión de la subclase:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Fish < Animal
end
puts Dog.new.speak
puts Fish.new.speakSalida:
Woof
...Un método de la superclase que llama a otro método utiliza la versión sobrescrita para los objetos de la subclase. El método compartido se escribe una sola vez, y cada subclase cambia únicamente la parte que difiere:
class Animal
def initialize(name)
@name = name
end
def introduce
"#{@name} says #{speak}"
end
def speak
"..."
end
end
class Cat < Animal
def speak
"Meow"
end
end
puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduceSalida:
Tom says Meow
Thing says ...Redefinir to_s en una subclase cambia cómo imprime únicamente esa subclase. Los métodos que no redefine siguen proviniendo de la superclase:
class Item
def initialize(name, price)
@name = name
@price = price
end
def to_s
format("%s %.2f", @name, @price)
end
end
class SaleItem < Item
def to_s
format("%s %.2f (sale)", @name, @price * 0.8)
end
end
puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)Salida:
Lamp 20.00
Lamp 16.00 (sale)El orden en que Ruby busca son los antecesores de la clase: la propia clase, después su superclase, y así sucesivamente hasta Object. La primera clase de esa lista que define el método lo proporciona:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Puppy < Dog
end
puts Puppy.new.speak
p Puppy.ancestors.take(3)Salida:
Woof
[Puppy, Dog, Animal]Desafío
FácilCompleta las clases de nómina. Employee almacena un name y tiene pay(hours), que devuelve hours * 20, y payslip(hours), que devuelve Ada: 800 usando pay. Manager redefine pay con un valor fijo de 1500 independientemente de las horas. Intern redefine pay con hours * 12, pero como máximo 300. payslip se define únicamente en Employee.
El código proporcionado lee líneas como employee Ada 40, manager Bo 50 o intern Cy 20, crea el objeto correspondiente e imprime su recibo de nómina; después imprime el pago total.
Tu código va en employee.rb, manager.rb e intern.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'employee'
require_relative 'manager'
require_relative 'intern'
# Código de entrada/salida suministrado: déjalo tal como está
input = []
while (line = gets)
input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
kind, name, hours = line.split
worker = kinds[kind].new(name)
puts worker.payslip(hours.to_i)
total += worker.pay(hours.to_i)
end
puts "total: #{total}"
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