Menu
CoddyTech

回顾:售票处

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

challenge icon

挑战

中等

用三种声明构建一个小型售票处。

  • Ticket 有一个私有构造函数,接收 number、show 和 seat。它的伴生对象包含 const val SEATS = 3、一个私有计数器和工厂函数 issue(show, seat),票号依次为 1、2、3……;issued 表示目前已发出的票数。label() 返回 #1 Hamlet seat 2。
  • BoxOffice 是一个对象。座位号不在 1 到 Ticket.SEATS 范围内时,sell(show, seat) 返回 no seat 4;该场次的这个座位已售出时,返回 seat 2 taken;否则,它会发出票并返回票面标签。refund(number) 会释放已售出票的座位并返回 refunded #1,如果没有对应的票,则返回 no ticket #9。report() 按场次名称的字母顺序返回 Hamlet 2/3, Cats 1/3,如果没有售出票,则返回 nothing sold。

提供的代码会读取 sell Hamlet 2、refund 1 或 report 命令,打印每条回复,最后输出 tickets issued: 和票数。退款后,票号不会重新使用。

你的代码要写在 Ticket.kt 和 BoxOffice.kt 中。Main.kt 包含提供的输入和输出代码,不能修改。

亲手试试

fun main() {
    // 提供的输入输出代码:保持原样。
    val input = generateSequence(::readLine).toList()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "sell" -> println(BoxOffice.sell(p[1], p[2].toInt()))
            "refund" -> println(BoxOffice.refund(p[1].toInt()))
            else -> println(BoxOffice.report())
        }
    }
    println("tickets issued: ${Ticket.issued}")
}

面向对象编程中的所有课

自己练习: Kotlin 在线编辑器