Menu
CoddyTech

转账

本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 24 课,共 70 课。

challenge icon

挑战

简单

你的数字银行项目快要完成了!最后一项重要功能是让账户之间能够转账。这正是面向对象设计大显身手的地方:一个账户对象可以直接与另一个账户对象交互。

你将添加一个 :transfer(targetAccount, amount) 方法,用于将钱从一个账户转到另一个账户。想一想,这个操作实际包含什么:先从源账户取款,再存入目标账户。妙处在于,你可以重用已经编写好的方法!

继续在现有文件的基础上进行开发:

  • Account.lua:在 Account 类中添加一个 :transfer(targetAccount, amount) 方法。这个方法应尝试从 self 中取出相应金额,如果成功,就将该金额存入 targetAccount。如果取款失败(余额不足),就不应进行转账。保留所有现有功能(带 ID 的构造函数、存款、取款、getBalance 和 __tostring)。
  • main.lua:创建多个账户,并演示它们之间的转账,展示不同账户对象的余额如何变化。

你将收到 5 个输入:

  1. 第一个账户的 ID
  2. 第二个账户的 ID
  3. 存入第一个账户的初始金额
  4. 第一次转账金额(从账户 1 转到账户 2)
  5. 第二次转账金额(从账户 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 在线编译器