回顾:员工目录
本课属于 Coddy Kotlin 学习旅程的“面向对象编程”单元。第 21 课,共 57 课。
挑战
中等构建一个员工目录类层次结构。
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 在线编辑器