独立实例
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 10 课,共 70 课。
面向对象编程的一个关键特点是,每个实例都维护自己的独立状态。当你从同一个类创建两个对象时,它们完全独立:更改其中一个不会影响另一个。
看这个例子:
local Counter = {}
Counter.__index = Counter
function Counter:new(start)
local instance = {}
setmetatable(instance, self)
instance.value = start or 0
return instance
end
function Counter:increment()
self.value = self.value + 1
end
-- 创建两个独立的计数器
local counterA = Counter:new(10)
local counterB = Counter:new(5)
counterA:increment()
counterA:increment()
print(counterA.value) -- 输出:12
print(counterB.value) -- 输出:5尽管这两个计数器都来自同一个 Counter 类,增加 counterA 的值不会影响 counterB。每个对象都有自己的 value 字段,存储在自己的实例表中。
正是这种独立性让对象变得实用。你可以在游戏中创建几十个玩家,每个玩家都记录自己的生命值和分数。你可以管理多个银行账户,每个账户的余额都不同。
类定义了结构和行为,但每个实例都有自己的数据,独立存在。
挑战
简单让我们证明,同一个类创建的对象确实各自独立!你将创建一个 Wallet 类,并创建两个独立的钱包实例,然后分别修改它们,以证明修改一个实例不会影响另一个实例。
你将把代码分成两个文件:
Wallet.lua:使用标准构造函数模式定义Wallet类。每个钱包都应记录自己的balance。其中包括:- 一个
:new(startingBalance)构造函数,用给定金额初始化钱包 - 一个
:add(amount)方法,用于增加余额 - 一个
:spend(amount)方法,用于减少余额
- 一个
main.lua:引入 Wallet 模块并创建两个独立的钱包实例。分别对它们执行不同的操作,展示它们如何保持独立状态。
你将收到 4 个输入:
- 钱包 A 的初始余额
- 钱包 B 的初始余额
- 添加到钱包 A 的金额
- 从钱包 B 中支出的金额
在主文件中:
- 使用第一个初始余额创建
walletA - 使用第二个初始余额创建
walletB - 向
walletA添加指定金额 - 从
walletB中支出指定金额 - 将两个余额分别打印在单独的行上
请严格按照以下格式打印最终余额:
Wallet A: [balance]
Wallet B: [balance]例如,如果输入是 100、50、25 和 10,输出应为:
Wallet A: 125
Wallet B: 40注意,向钱包 A 添加金额不会改变钱包 B,从钱包 B 中支出也不会影响钱包 A:每个实例都维护自己的独立余额。
亲手试试
-- 引入 Wallet 模块
local Wallet = require('Wallet')
-- 读取输入
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())
-- TODO: 用第一个初始余额创建 walletA
-- TODO: 用第二个初始余额创建 walletB
-- TODO: 向 walletA 添加指定金额
-- TODO: 从 walletB 中支出指定金额
-- TODO: 按要求的格式输出最终余额
-- 格式:"Wallet A: [balance]" 和 "Wallet B: [balance]"
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器