復習 - スタッフ名簿
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 21/57。
チャレンジ
中級クラス階層としてスタッフ名簿を作成してください。
Person(name)は抽象クラスです。抽象メソッドrole()を宣言し、card()を実装します。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プレイグラウンド