Menu
CoddyTech

回顾:动物园管理员

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

challenge icon

挑战

中等

规划一天的动物园行程。

  • Animal(name, kg) 是抽象类,包含抽象成员 species、food 和 dailyGrams(),以及一个返回 Leo the lion: 5700 g meat 的方法 line()。
  • Lion 吃肉,每千克体重每天吃 30 g。Parrot 吃种子,每天吃 50 g,与体重无关。Seal 吃鱼,每千克体重每天吃 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: 行,以及每个返回的把戏各占一行的 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 在线编辑器