Menu
Coddy logo textTech

Recapitulação - Métodos de Pagamento

Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 26 de 57.

challenge icon

Desafio

Médio

Projete métodos de pagamento em torno de uma interface.

  • PaymentMethod exige name, fee(amount), pay(amount) (retorna se o pagamento foi realizado) e status(), e fornece um total(amount) padrão: o valor mais a taxa.
  • Card (nome card) cobra uma taxa de 2% (arredondada para baixo), sempre realiza o pagamento e contabiliza seus pagamentos: card: 2 payment(s).
  • Wallet(balance) (nome wallet) não tem taxa e realiza o pagamento somente quando o saldo cobre o total, que então é subtraído: wallet: 50 left.
  • GiftCard(balance) (nome gift card) também não tem taxa, mas só realiza pagamentos de valores de no máximo 100, e somente quando o saldo os cobre: gift card: 40 left.

Em seguida, complete checkout(amount, methods), que tenta cada PaymentMethod na ordem e retorna paid 100 with wallet (total 100) para o primeiro que realiza o pagamento, ou declined quando nenhum realiza.

O código fornecido lê os métodos como card,wallet:150,gift:120, depois lê um valor por linha, imprime o resultado de cada checkout e, por fim, o status() de cada método.

Seu código deve ficar em PaymentMethod.kt, Card.kt, Wallet.kt, GiftCard.kt e Functions.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

fun main() {
    // Código de entrada/saída fornecido: mantenha-o como está
    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())
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Kotlin