Menu
CoddyTech

停车场

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

challenge icon

挑战

困难

构建一个停车场。

  • 枚举 Size 按顺序包含 SMALL、MEDIUM 和 LARGE,每个值都有一个小写的 label。
  • Vehicle(plate) 是一个密封类,具有抽象属性 size 和 hourlyRate。Motorbike 是小型车辆(每小时 1),Car 是中型车辆(3),Van 是大型车辆(5)。
  • 创建 Garage(small, medium, large) 时,需要指定每种尺寸的车位数量。park(vehicle) 会将车辆停入一个空闲的同尺寸车位;如果没有,则停入有空位的下一个更大尺寸车位,并返回 parked AB12 in medium、full for AB12 或 AB12 is already parked。leave(plate, hours) 会释放车位并返回 AB12 paid 9(费率乘以小时数,至少按 1 小时计算),或者返回 no vehicle AB12。status() 会返回 free: small 1, medium 0, large 2。

提供的代码会读取车位数量,格式为 small,medium,large,然后读取命令 park car AB12(bike、car 或 van)、leave AB12 3 或 status,并打印每条回复。

你的代码应写在 Size.kt、Vehicle.kt、Motorbike.kt、Car.kt、Van.kt 和 Garage.kt 中。Main.kt 包含提供的输入/输出代码,不能编辑。

亲手试试

fun main() {
    // 提供的输入输出代码:保持原样。
    val input = generateSequence(::readLine).toList()
    val (small, medium, large) = input[0].split(",").map { it.toInt() }
    val garage = Garage(small, medium, large)
    for (cmd in input.drop(1)) {
        val p = cmd.split(" ")
        when (p[0]) {
            "park" -> {
                val vehicle = when (p[1]) {
                    "bike" -> Motorbike(p[2])
                    "van" -> Van(p[2])
                    else -> Car(p[2])
                }
                println(garage.park(vehicle))
            }
            "leave" -> println(garage.leave(p[1], p[2].toInt()))
            else -> println(garage.status())
        }
    }
}

面向对象编程中的所有课

自己练习: Kotlin 在线编辑器