命名约定
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 43 课,共 70 课。
在 Lua 中,默认情况下,所有表字段都可以公开访问。任何人都可以直接读取或修改 self.health。虽然 Lua 不强制执行隐私限制,但程序员会使用命名约定来表达意图:指出哪些字段应被视为内部实现细节。
标准约定是在私有字段前加上下划线:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- 公开:可以直接访问
_health = 100, -- 私有:请改用方法访问
_score = 0 -- 私有:用于内部记录
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
end下划线不会改变 Lua 的工作方式:player._health 在技术上仍然可以访问。不过,它会明确提醒其他程序员(也提醒未来的你):“这个字段应该是私有的。请改用方法访问它。”
这个约定很重要,因为它将接口(其他人应该使用的内容)与实现(内部的工作方式)分开。如果你之后需要添加验证或更改健康值的存储方式,只需修改方法:使用 :getHealth() 的代码仍然可以照常运行。
挑战
简单让我们来构建一个 BankAccount 类,使用下划线命名约定,明确标示哪些字段应为私有字段!
你要把代码分成两个文件:
BankAccount.lua:创建一个用于管理账户信息的类。构造函数:new(ownerName, initialBalance)应将账户所有者的姓名存储为公有字段(owner),并将余额存储为私有字段(_balance)。添加三个方法::getBalance():返回当前余额:deposit(amount):将金额加到_balance:getOwner():返回账户所有者的姓名
main.lua:引入你的 BankAccount 模块,从输入中读取账户所有者的姓名、初始余额和存款金额。创建账户,存入一笔款项,然后打印账户所有者和最终余额。
你会收到三个输入:
- 账户所有者的姓名
- 初始余额(一个数字)
- 存款金额(一个数字)
输出应为两行,显示账户所有者以及存款后的最终余额:
Owner: {ownerName}
Balance: {finalBalance}例如,如果输入是 Maria、500 和 150,输出应为:
Owner: Maria
Balance: 650请记住:_balance 前面的下划线表示应通过 :getBalance() 和 :deposit() 这样的方法访问该字段,而不是直接访问,这是在提醒其他程序员。没有下划线的 owner 字段则表示可以公开访问。
亲手试试
-- 加载 BankAccount 模块
local BankAccount = require('BankAccount')
-- 读取输入
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: 使用 ownerName 和 initialBalance 创建一个新的 BankAccount 对象
-- TODO: 使用 depositAmount 存款
-- TODO: 按要求的格式输出账户所有者和最终余额
-- 格式:
-- Owner: {ownerName}
-- Balance: {finalBalance}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器