Menu
CoddyTech

Повторение — иерархия сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 20 из 65.

challenge icon

Задание

Средне

Создай иерархию классов компании в пяти файлах.

  • Person: person_name и age, задаваемые конструктором. introduce() возвращает Hi, I'm NAME, AGE years old.
  • Employee наследуется от Person и добавляет employee_id (String) и salary (годовая зарплата, int). Переопредели introduce(), чтобы добавить My employee ID is ID. после текста родительского класса. monthly_pay() возвращает зарплату, делённую на 12.0.
  • Manager наследуется от Employee и добавляет department. Его monthly_pay() равна зарплате сотрудника, умноженной на 1.2, а manage_team() возвращает Managing the DEPARTMENT department.
  • Engineer наследуется от Employee и добавляет language. code() возвращает Coding in LANGUAGE.
  • Payroll содержит две статические функции. role(p) возвращает Manager, Engineer, Employee или Person — самый конкретный класс объекта p. total_monthly(people) возвращает сумму значений monthly_pay() для тех людей, которые являются сотрудниками (включая менеджеров и инженеров).

Каждый конструктор передаёт значения родительского класса в super(), а каждое переопределение, дополняющее результат родительского класса, использует super().

Предоставленный код считывает количество следующих далее людей, а затем по одной строке для каждого: person NAME AGE, employee NAME AGE ID SALARY, manager NAME AGE ID SALARY DEPARTMENT или engineer NAME AGE ID SALARY LANGUAGE. Для каждого человека он выводит роль в квадратных скобках и introduce(), ежемесячную зарплату для сотрудников, manage_team() или code(), если они есть, а в конце — общую сумму. Для employee Alice 35 E123 60000 и manager Bob 45 M54 85000 Marketing вывод будет таким:

[Employee] Hi, I'm Alice, 35 years old. My employee ID is E123.
Monthly pay: 5000.00
[Manager] Hi, I'm Bob, 45 years old. My employee ID is M54.
Monthly pay: 8500.00
Managing the Marketing department.
Total monthly payroll: 13500.00

Твой код размести в файлах person.gd, employee.gd, manager.gd, engineer.gd и payroll.gd. В main.gd содержится предоставленный код ввода-вывода, который нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода/вывода: оставьте его без изменений
	var count := int(OS.read_string_from_stdin())
	var people: Array[Person] = []
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "manager":
			people.append(Manager.new(p[1], int(p[2]), p[3], int(p[4]), p[5]))
		elif p[0] == "engineer":
			people.append(Engineer.new(p[1], int(p[2]), p[3], int(p[4]), p[5]))
		elif p[0] == "employee":
			people.append(Employee.new(p[1], int(p[2]), p[3], int(p[4])))
		else:
			people.append(Person.new(p[1], int(p[2])))
	for person in people:
		print("[%s] %s" % [Payroll.role(person), person.introduce()])
		if person is Employee:
			print("Monthly pay: %.2f" % (person as Employee).monthly_pay())
		if person is Manager:
			print((person as Manager).manage_team())
		elif person is Engineer:
			print((person as Engineer).code())
	print("Total monthly payroll: %.2f" % Payroll.total_monthly(people))

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript