Повторение — расчёт зарплаты сотрудников
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 26 из 57.
Задание
СреднеСоздай расчёт заработной платы с наследованием. Employee.new(name, rate) имеет метод pay(hours) (ставка, умноженная на количество часов, при этом часы свыше 40 оплачиваются по ставке, умноженной на 1.5) и метод line(hours), возвращающий Ada (employee): 800.00, сформированный на основе pay(hours) и role, где role возвращает employee. Manager.new(name, rate, bonus) передаёт имя и ставку в super, добавляет бонус к оплате, рассчитанной super, и имеет роль manager. Contractor < Employee получает оплату по ставке, умноженной на количество часов, без сверхурочных, и имеет роль contractor.
Предоставленный код считывает строки employee Ada 20 40, manager Bo 30 45 500 или contractor Cy 50 50 (имя, ставка, количество часов и бонус для менеджеров) и выводит line(hours) для каждого, затем staff: 3, managers: 1, employees: 3 (все подсчитываются с помощью is_a?, поэтому менеджеры и подрядчики также являются сотрудниками) и общую оплату.
Твой код должен находиться в employee.rb, manager.rb и contractor.rb. В main.rb находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'employee'
require_relative 'manager'
require_relative 'contractor'
# Предоставленный код ввода/вывода: оставьте его как есть
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) })
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПеременные экземпляраМетоды и selfto_s и inspectПовторение — читательский билет4Инкапсуляция
Приватные методыЗащищённые методыПриватные сеттерыЗащита состоянияПовторение — торговый автомат7Полиморфизм и утиная типизация
ПолиморфизмУтиная типизацияАбстрактные методыcase и классыПовторение — способы оплаты10Шаблоны проектирования, часть 2
Делегирование с помощью ForwardableШаблон декоратораШаблон строителяШаблон состояния2Аксессоры и self
Чтение и записьПользовательские сеттерыself в методахИдентичность и равенствоПовторение — список контактов5Наследование
ПодклассыПереопределение методовВызов superis_a? и предкиПовторение — расчёт зарплаты сотрудников8Специальные методы
Равенство и хешированиеМетоды операторовИндексация и добавлениеПользовательские коллекцииПовторение — дроби11Проект: Управление библиотекой
Книги и читателиВыдача книг3Методы и переменные классов
Методы классовПеременные экземпляра классаКонстантыФабричные методыПовторение — коды купонов6Модули и примеси
Модули и includeРасширение объектовМодуль ComparableМодуль EnumerableПовторение — спортивная лига9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор Ruby