Método de Saque
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 21 de 70.
Desafio
FácilSeu Banco Digital está crescendo! As contas agora podem receber depósitos, mas um banco real também precisa permitir que os clientes retirem dinheiro. Vamos adicionar um método :withdraw(amount)—mas com uma verificação de segurança importante.
Diferente dos depósitos, os saques podem falhar. Se um cliente tentar sacar mais dinheiro do que possui, o banco não deve permitir. Seu método de saque precisa verificar se existem fundos suficientes antes de deduzir o valor.
Você continuará trabalhando com seus dois arquivos:
Account.lua: Adicione um método:withdraw(amount)à sua classe Account existente. Se a conta tiver saldo suficiente, subtraia o valor e retornetrue. Se não houver fundos suficientes, imprimaInsufficient fundse retornefalsesem alterar o saldo.main.lua: Crie uma conta, faça um depósito para dar alguns fundos a ela e, em seguida, tente vários saques para ver tanto transações bem-sucedidas quanto falhas.
Você receberá quatro entradas:
- Valor do depósito inicial
- Valor do primeiro saque
- Valor do segundo saque
- Valor do terceiro saque
Em seu arquivo principal, crie uma conta, deposite o valor inicial e, em seguida, tente cada saque em ordem. Após cada tentativa de saque, imprima o saldo atual em uma nova linha. Lembre-se de que saques que falharem também imprimirão Insufficient funds antes de você imprimir o saldo.
Por exemplo, se as entradas forem 100, 30, 50 e 40, a saída deve ser:
70
20
Insufficient funds
20A conta começa com 100 após o depósito. O primeiro saque de 30 é bem-sucedido (saldo: 70), o segundo saque de 50 é bem-sucedido (saldo: 20), mas o terceiro saque de 40 falha porque restam apenas 20—então o saldo permanece em 20.
Experimente você mesmo
-- Requer o módulo Account
local Account = require('Account')
-- Lê as quatro entradas
local initialDeposit = tonumber(io.read())
local withdrawal1 = tonumber(io.read())
local withdrawal2 = tonumber(io.read())
local withdrawal3 = tonumber(io.read())
-- Cria uma única conta
local account = Account:new()
-- Deposita o valor inicial
account:deposit(initialDeposit)
-- Tenta o primeiro saque e imprime o saldo
-- TODO: chamar account:withdraw(withdrawal1) aqui
print(account.balance)
-- Tenta o segundo saque e imprime o saldo
-- TODO: chamar account:withdraw(withdrawal2) aqui
print(account.balance)
-- Tenta o terceiro saque e imprime o saldo
-- TODO: chamar account:withdraw(withdrawal3) aqui
print(account.balance)
Todas as lições de Object Oriented Programming
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas