Repaso - Nómina del personal
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 26 de 57.
Desafío
IntermedioConstruye una nómina con herencia. Employee.new(name, rate) tiene pay(hours) (la tarifa multiplicada por las horas, y las horas por encima de 40 se pagan a 1.5 veces la tarifa) y line(hours), que devuelve Ada (employee): 800.00, construido a partir de pay(hours) y role, donde role devuelve employee. Manager.new(name, rate, bonus) pasa el nombre y la tarifa a super, añade el bono al pago de super y tiene el rol manager. Contractor < Employee recibe la tarifa multiplicada por las horas, sin horas extra, y tiene el rol contractor.
El código proporcionado lee líneas employee Ada 20 40, manager Bo 30 45 500 o contractor Cy 50 50 (nombre, tarifa, horas y un bono para los managers) e imprime line(hours) para cada una; después, staff: 3, managers: 1, employees: 3 (ambos se cuentan con is_a?, por lo que los managers y los contractors también son empleados) y el pago total.
Tu código va en employee.rb, manager.rb y contractor.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 'contractor'
# Código de entrada/salida suministrado: déjalo como está
input = []
while (line = gets)
input << line.chomp
end
staff = input.map do |line|
kind, name, rate, hours, bonus = line.split
worker = case kind
when "manager" then Manager.new(name, rate.to_f, bonus.to_f)
when "contractor" then Contractor.new(name, rate.to_f)
else Employee.new(name, rate.to_f)
end
[worker, hours.to_i]
end
staff.each { |worker, hours| puts worker.line(hours) }
managers = staff.count { |w, _| w.is_a?(Manager) }
employees = staff.count { |w, _| w.is_a?(Employee) }
puts "staff: #{staff.size}, managers: #{managers}, employees: #{employees}"
puts format("total: %.2f", staff.sum { |w, h| w.pay(h) })
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