Menu
CoddyTech

Revisão - Hierarquia de funcionários

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 20 de 65.

challenge icon

Desafio

Médio

Crie a hierarquia de classes de uma empresa em cinco arquivos.

  • Person: person_name e age, definidos pelo construtor. introduce() retorna Hi, I'm NAME, AGE years old.
  • Employee estende Person e adiciona employee_id (String) e salary (anual, int). Sobrescreva introduce() para adicionar My employee ID is ID. após o texto da classe pai. monthly_pay() retorna o salário dividido por 12.0.
  • Manager estende Employee e adiciona department. Seu monthly_pay() é o pagamento do funcionário multiplicado por 1.2, e manage_team() retorna Managing the DEPARTMENT department.
  • Engineer estende Employee e adiciona language. code() retorna Coding in LANGUAGE.
  • Payroll tem duas funções estáticas. role(p) retorna Manager, Engineer, Employee ou Person, a classe mais específica de p. total_monthly(people) retorna a soma de monthly_pay() das pessoas que são funcionários (incluindo gerentes e engenheiros).

Todo construtor passa os valores da classe pai para super(), e toda sobrescrita que estende o resultado da classe pai usa super().

O código fornecido lê quantas pessoas vêm a seguir e, então, uma linha para cada uma: person NAME AGE, employee NAME AGE ID SALARY, manager NAME AGE ID SALARY DEPARTMENT ou engineer NAME AGE ID SALARY LANGUAGE. Para cada pessoa, ele imprime a função entre colchetes e introduce(), o pagamento mensal para funcionários, manage_team() ou code() quando existirem e, no final, o total. Para employee Alice 35 E123 60000 e manager Bob 45 M54 85000 Marketing, ele imprime:

[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

Seu código deve ficar em person.gd, employee.gd, manager.gd, engineer.gd e payroll.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o como está
	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))

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online