Menu
CoddyTech

Tổng kết: phân cấp nhân viên

Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 20 trên 65.

challenge icon

Thử thách

Trung bình

Xây dựng hệ thống phân cấp lớp của một công ty trong năm tệp.

  • Person: có person_name và age, được thiết lập bằng hàm khởi tạo. introduce() trả về Hi, I'm NAME, AGE years old.
  • Employee kế thừa Person và bổ sung employee_id (String) cùng salary (lương hằng năm, int). Ghi đè introduce() để thêm My employee ID is ID. sau nội dung của lớp cha. monthly_pay() trả về tiền lương chia cho 12.0.
  • Manager kế thừa Employee và bổ sung department. monthly_pay() của lớp này bằng tiền lương của nhân viên nhân với 1.2, còn manage_team() trả về Managing the DEPARTMENT department.
  • Engineer kế thừa Employee và bổ sung language. code() trả về Coding in LANGUAGE.
  • Payroll có hai hàm tĩnh. role(p) trả về Manager, Engineer, Employee hoặc Person, tức là lớp cụ thể nhất của p. total_monthly(people) trả về tổng monthly_pay() của những người là nhân viên, bao gồm cả quản lý và kỹ sư.

Mỗi hàm khởi tạo truyền các giá trị của lớp cha cho super(), và mỗi hàm ghi đè mở rộng kết quả của lớp cha đều dùng super().

Code được cung cấp đọc số lượng người, sau đó đọc mỗi người trên một dòng: person NAME AGE, employee NAME AGE ID SALARY, manager NAME AGE ID SALARY DEPARTMENT hoặc engineer NAME AGE ID SALARY LANGUAGE. Với mỗi người, chương trình in vai trò trong ngoặc vuông và introduce(), tiền lương hằng tháng của nhân viên, manage_team() hoặc code() nếu có, rồi in tổng số ở cuối. Với employee Alice 35 E123 60000 và manager Bob 45 M54 85000 Marketing, chương trình in:

[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

Viết code trong các tệp person.gd, employee.gd, manager.gd, engineer.gd và payroll.gd. Tệp main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
	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))

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch GDScript online