Menu
CoddyTech

复习:支付方式

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

challenge icon

挑战

中等

围绕一个接口设计支付方式。

  • PaymentMethod 要求提供 name、fee(amount)、pay(amount)(返回是否支付成功)和 status(),并提供默认的 total(amount):金额加上手续费。
  • Card(名称为 card)收取 2% 的手续费(向下取整),始终支付成功,并记录支付次数:card: 2 payment(s)。
  • Wallet(balance)(名称为 wallet)不收取手续费,只有余额足以支付总额时才会支付,并从余额中扣除该总额:wallet: 50 left。
  • GiftCard(balance)(名称为 gift card)也不收取手续费,但只支付不超过 100 的金额,并且只有余额足够时才会支付:gift card: 40 left。

接着完成 checkout(amount, methods),按顺序尝试每个 PaymentMethod,第一个支付成功时返回 paid 100 with wallet (total 100);如果都无法支付,则返回 declined。

提供的代码会读取支付方式,格式为 card,wallet:150,gift:120,然后逐行读取金额,输出每次结账的结果,最后输出每种支付方式的 status()。

你的代码要写在 PaymentMethod.kt、Card.kt、Wallet.kt、GiftCard.kt 和 Functions.kt 中。Main.kt 包含提供的输入输出代码,不能编辑。

亲手试试

fun main() {
    // 提供的输入/输出代码:保持原样
    val input = generateSequence(::readLine).toList()
    val methods = input[0].split(",").map { spec ->
        val p = spec.split(":")
        when (p[0]) {
            "card" -> Card()
            "wallet" -> Wallet(p[1].toInt())
            else -> GiftCard(p[1].toInt())
        }
    }
    for (line in input.drop(1)) println(checkout(line.toInt(), methods))
    for (m in methods) println(m.status())
}

面向对象编程中的所有课

自己练习: Kotlin 在线编辑器