Menu
Coddy logo textTech

Повторение — способы оплаты

Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 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