Menu
CoddyTech

回顾:员工目录

本课属于 Coddy Kotlin 学习旅程的“面向对象编程”单元。第 21 课,共 57 课。

challenge icon

挑战

中等

构建一个员工目录类层次结构。

  • Person(name) 是抽象类。它声明抽象的 role(),并实现 card(),该方法返回 Ada (staff in sales),且不能被重写。
  • Staff(name, department) 是开放类;它的角色是 staff in sales。
  • Manager(name, department) 继承 Staff,并维护一个私有团队。满足以下条件时,hire(member) 会返回 true 并添加该成员:该成员在同一个部门工作、不是经理本人,并且尚未加入团队。否则返回 false。它的角色是在 Staff 的角色后加上 , 2 reports(使用 super)。
  • Contractor(name, days) 继承 Person;它的角色是 contractor for 30 days。

提供的代码会读取命令 staff Ada sales、manager Bo sales、contractor Cy 30 或 hire Bo Ada(会打印 hired 或 refused,即使名字未知也是如此),然后按添加顺序打印每个人的名片。

你的代码要写在 Person.kt、Staff.kt、Manager.kt 和 Contractor.kt 中。Main.kt 包含提供的输入/输出代码,不能编辑。

亲手试试

fun main() {
    // 提供的输入/输出代码:保持原样
    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())
}

面向对象编程中的所有课

自己练习: Kotlin 在线编辑器