Menu
Coddy logo textTech

復習 - スタッフ名簿

CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 21/57。

challenge icon

チャレンジ

中級

クラス階層としてスタッフ名簿を作成してください。

  • 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プレイグラウンド