Menu
CoddyTech

Ôn tập: Danh bạ nhân viên

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

challenge icon

Thử thách

Trung bình

Xây dựng danh bạ nhân viên bằng hệ thống phân cấp lớp.

  • Person(name) là lớp trừu tượng. Lớp này khai báo hàm trừu tượng role() và triển khai card(), hàm này trả về Ada (staff in sales) và không thể bị ghi đè.
  • Staff(name, department) có thể được kế thừa; vai trò của lớp này là staff in sales.
  • Manager(name, department) kế thừa Staff và quản lý một nhóm riêng tư. hire(member) trả về true và thêm thành viên nếu người đó làm cùng phòng ban, không phải là người quản lý và chưa có trong nhóm; nếu không thì trả về false. Vai trò của lớp này là vai trò của Staff, theo sau là , 2 reports (dùng super).
  • Contractor(name, days) kế thừa Person; vai trò của lớp này là contractor for 30 days.

Code được cung cấp đọc các lệnh staff Ada sales, manager Bo sales, contractor Cy 30 hoặc hire Bo Ada (lệnh này in ra hired hoặc refused, kể cả khi không biết tên), sau đó in thẻ của từng người theo thứ tự họ được thêm vào.

Code của bạn nằm trong các tệp Person.kt, Staff.kt, Manager.kt và Contractor.kt. Main.kt chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

fun main() {
    // Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
    val input = generateSequence(::readLine).toList()
    val people = mutableListOf<Person>()
    val staff = mutableMapOf<String, Staff>()
    val managers = mutableMapOf<String, Manager>()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "staff" -> Staff(p[1], p[2]).also { people.add(it); staff[it.name] = it }
            "manager" -> Manager(p[1], p[2]).also { people.add(it); staff[it.name] = it; managers[it.name] = it }
            "contractor" -> people.add(Contractor(p[1], p[2].toInt()))
            "hire" -> {
                val boss = managers[p[1]]
                val worker = staff[p[2]]
                println(if (boss != null && worker != null && boss.hire(worker)) "hired" else "refused")
            }
        }
    }
    for (person in people) println(person.card())
}

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

Tự luyện tập: Playground Kotlin