Итоги — Роли сотрудников
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 42 из 70.
Задание
ЛегкоДавайте создадим систему расчета премий, которая демонстрирует, как различные типы сотрудников могут использовать один и тот же интерфейс, рассчитывая премии по-разному!
Вы создадите небольшую иерархию сотрудников в четырех файлах:
Employee.lua: Ваш базовый класс, представляющий обычного сотрудника. Конструктор:new(name, salary)должен сохранять имя сотрудника и его зарплату. Включите метод:calculateBonus(), который возвращает 10% от зарплаты (премия по умолчанию для обычных сотрудников), и метод:getName()для получения имени.Manager.lua: Дочерний класс, наследуемый от Employee. Менеджеры много работают и получают вознаграждение — переопределите:calculateBonus(), чтобы он возвращал 20% от их зарплаты вместо стандартных 10%.Intern.lua: Еще один дочерний класс, наследуемый от Employee. Стажеры получают фиксированную премию в размере50независимо от их зарплаты — переопределите:calculateBonus(), чтобы он всегда возвращал эту сумму.main.lua: Соберите все вместе! Считайте три входных значения для имен сотрудников и три входных значения для их зарплат. Создайте одного Manager, одного Intern и одного обычного Employee. Сохраните всех троих в таблицу, затем переберите ее в цикле и выведите имя каждого человека, а затем его рассчитанную премию.
Вы получите шесть входных значений:
- Имя менеджера
- Зарплата менеджера
- Имя стажера
- Зарплата стажера
- Имя обычного сотрудника
- Зарплата обычного сотрудника
Для каждого сотрудника в вашей коллекции (в порядке: Manager, Intern, Employee) выведите его имя и премию в следующем формате:
{name}: {bonus}Например, если входные данные — Alice, 5000, Bob, 2000, Carol и 3000, вывод должен быть следующим:
Alice: 1000
Bob: 50
Carol: 300Обратите внимание, как один и тот же вызов :calculateBonus() дает разные результаты в зависимости от типа каждого сотрудника — это и есть полиморфизм в действии! Менеджер получает 20% от 5000, стажер получает фиксированные 50, а обычный сотрудник получает 10% от 3000.
Попробуйте сами
-- main.lua: Собираем всё вместе
local Employee = require('Employee')
local Manager = require('Manager')
local Intern = require('Intern')
-- Чтение входных данных
local managerName = io.read()
local managerSalary = tonumber(io.read())
local internName = io.read()
local internSalary = tonumber(io.read())
local employeeName = io.read()
local employeeSalary = tonumber(io.read())
-- TODO: Создайте одного Manager, одного Intern и одного обычного Employee
-- TODO: Сохраните всех троих в таблицу (в порядке: Manager, Intern, Employee)
-- TODO: Пройдите циклом по таблице и выведите имя и бонус каждого человека
-- Формат: {name}: {bonus}
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур