转账
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 24 课,共 70 课。
挑战
简单你的数字银行项目快要完成了!最后一项重要功能是让账户之间能够转账。这正是面向对象设计大显身手的地方:一个账户对象可以直接与另一个账户对象交互。
你将添加一个 :transfer(targetAccount, amount) 方法,用于将钱从一个账户转到另一个账户。想一想,这个操作实际包含什么:先从源账户取款,再存入目标账户。妙处在于,你可以重用已经编写好的方法!
继续在现有文件的基础上进行开发:
Account.lua:在 Account 类中添加一个:transfer(targetAccount, amount)方法。这个方法应尝试从self中取出相应金额,如果成功,就将该金额存入targetAccount。如果取款失败(余额不足),就不应进行转账。保留所有现有功能(带 ID 的构造函数、存款、取款、getBalance 和 __tostring)。main.lua:创建多个账户,并演示它们之间的转账,展示不同账户对象的余额如何变化。
你将收到 5 个输入:
- 第一个账户的 ID
- 第二个账户的 ID
- 存入第一个账户的初始金额
- 第一次转账金额(从账户 1 转到账户 2)
- 第二次转账金额(从账户 1 转到账户 2)
在主文件中,使用给定的 ID 创建两个账户(两者的初始余额都为 0),将初始金额存入第一个账户,然后尝试从第一个账户向第二个账户转账两次。每次尝试转账后,都打印两个账户(__tostring 会显示它们的当前状态)。
例如,如果输入是 101、102、500、200 和 400,输出应为:
Account [101]: Balance = 300
Account [102]: Balance = 200
Insufficient funds
Account [101]: Balance = 300
Account [102]: Balance = 200存款后,第一个账户的余额为 500。第一次转账 200 成功,第一个账户 101 的余额变为 300,第二个账户 102 的余额变为 200。第二次转账 400 失败,因为账户 101 只有 300,因此两个账户的余额都保持不变。
亲手试试
-- 加载 Account 模块
local Account = require('Account')
-- 读取 5 个输入
local id1 = io.read()
local id2 = io.read()
local initialDeposit = tonumber(io.read())
local transfer1 = tonumber(io.read())
local transfer2 = tonumber(io.read())
-- 创建两个带有 ID 的账户
local account1 = Account:new(id1)
local account2 = Account:new(id2)
-- 将初始金额存入第一个账户
account1:deposit(initialDeposit)
-- TODO:尝试首次从 account1 向 account2 转账
-- TODO:首次转账后打印两个账户
-- TODO:尝试第二次从 account1 向 account2 转账
-- TODO:第二次转账后打印两个账户
面向对象编程中的所有课
自己练习: Lua 在线编译器