Menu
Coddy logo textTech

復習 - 動物園の飼育員

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

challenge icon

チャレンジ

中級

動物園での一日を計画しましょう。

  • Animal(name, kg)は、抽象メンバーspecies、food、dailyGrams()と、Leo the lion: 5700 g meatを返すメソッドline()を持つ抽象クラスです。
  • Lionは肉を、1 kgあたり30 g食べます。Parrotは種を、体重にかかわらず1日50 g食べます。Sealは魚を、1 kgあたり40 g食べます。
  • インターフェースTrainableはtrick()を持ちます。オウム(Polly says hello)とアザラシ(Sammy balances a ball)は訓練可能ですが、ライオンは訓練できません。
  • 拡張List<Animal>.foodTotals()は、食べ物ごとのグラム数を、食べ物をアルファベット順に並べて返します。例: fish 4000, meat 5700。
  • showLineup(animals)は、型チェックを使用して、訓練可能な動物の芸を順番どおりに返します。該当する動物がいない場合はno showを返します。

提供されたコードは、lion,Leo,190、parrot,Polly,1、またはseal,Sammy,100の行を読み込み、すべてのline()を出力します。その後、合計値を伴うfood: と、返された芸ごとに1行のshow: を出力します。

コードはAnimal.kt、Trainable.kt、Lion.kt、Parrot.kt、Seal.kt、Functions.ktに記述します。Main.ktには提供された入出力コードが含まれており、編集できません。

自分で試してみよう

fun main() {
    // 提供された入出力コード: そのままにしておく
    val input = generateSequence(::readLine).toList()
    val animals = input.map { line ->
        val (kind, name, kg) = line.split(",")
        when (kind) {
            "lion" -> Lion(name, kg.toInt())
            "parrot" -> Parrot(name, kg.toInt())
            else -> Seal(name, kg.toInt())
        }
    }
    for (a in animals) println(a.line())
    println("food: " + animals.foodTotals())
    for (s in showLineup(animals)) println("show: $s")
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Kotlinプレイグラウンド