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.
Desafio
MédioProjete métodos de pagamento em torno de uma interface.
PaymentMethodexigename,fee(amount),pay(amount)(retorna se o pagamento foi realizado) estatus(), e fornece umtotal(amount)padrão: o valor mais a taxa.Card(nomecard) cobra uma taxa de 2% (arredondada para baixo), sempre realiza o pagamento e contabiliza seus pagamentos:card: 2 payment(s).Wallet(balance)(nomewallet) 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)(nomegift 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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesConstrutores PrimáriosBlocos init e ValidaçãoConstrutores SecundáriosRecapitulação - Cartão da Biblioteca4Herança
Classes Abertas e SubclassesSobrescrevendo Membrossuper e ConstrutoresClasses AbstratasRevisão - Diretório de Funcionários2Propriedades e Encapsulamento
Acessores PersonalizadosModificadores de VisibilidadeSetters Privadoslazy e lateinitRevisão - Conta Bancária5Interfaces
Declarando InterfacesMétodos PadrãoMúltiplas InterfacesInterfaces como TiposRecapitulação - Métodos de Pagamento8Genéricos
Funções genéricasClasses genéricasRestrições de tipoVariância com in e outRecapitulação - Fila de prioridade11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Kotlin