Menu
CoddyTech

独立实例

本课属于 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 字段,存储在自己的实例表中。

正是这种独立性让对象变得实用。你可以在游戏中创建几十个玩家,每个玩家都记录自己的生命值和分数。你可以管理多个银行账户,每个账户的余额都不同。

类定义了结构和行为,但每个实例都有自己的数据,独立存在。

challenge icon

挑战

简单

让我们证明,同一个类创建的对象确实各自独立!你将创建一个 Wallet 类,并创建两个独立的钱包实例,然后分别修改它们,以证明修改一个实例不会影响另一个实例。

你将把代码分成两个文件:

  • Wallet.lua:使用标准构造函数模式定义 Wallet 类。每个钱包都应记录自己的 balance。其中包括:
    • 一个 :new(startingBalance) 构造函数,用给定金额初始化钱包
    • 一个 :add(amount) 方法,用于增加余额
    • 一个 :spend(amount) 方法,用于减少余额
  • main.lua:引入 Wallet 模块并创建两个独立的钱包实例。分别对它们执行不同的操作,展示它们如何保持独立状态。

你将收到 4 个输入:

  1. 钱包 A 的初始余额
  2. 钱包 B 的初始余额
  3. 添加到钱包 A 的金额
  4. 从钱包 B 中支出的金额

在主文件中:

  1. 使用第一个初始余额创建 walletA
  2. 使用第二个初始余额创建 walletB
  3. 向 walletA 添加指定金额
  4. 从 walletB 中支出指定金额
  5. 将两个余额分别打印在单独的行上

请严格按照以下格式打印最终余额:

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]"
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Lua 在线编译器