课时 12 · 面向对象编程
课时 12 · 面向对象编程(Lua 进阶):用表与元表模拟类与继承。含可运行的示例代码、练习与验收要点,示例锁定 Lua 5.1,可在站内在线运行验证。
本课的代码可以就地复制;点代码块右上角的「运行这段」, 会带着这段代码打开 Lua 在线运行器 并直接跑出结果 (课程示例统一按 5.1 跑;运行器里也能切到 5.3)。
本课的代码跑在 996 引擎里,用到的是服务端接口(changeexp、 SetInt 这类),在线运行器里没有这些函数。 每个函数的签名都能在 文档检索 里按名字查到原文。
本课目标
- 用表与元表模拟类与继承。
知识讲解
Lua 没有原生 class 关键字,用表 + 元表模拟:类是一张表,实例通过冒号方法访问类方法(__index 指向类),构造函数通常是类的 new 方法,继承把子类的 __index 指向父类实例。冒号语法 function obj:method() 等价于 function obj.method(self)。
示例:玩家类与继承
local Player = {}
Player.__index = Player
function Player.new(name, level)
local self = setmetatable({}, Player)
self.name, self.level = name, level
return self
end
function Player:levelUp()
self.level = self.level + 1
print(self.name, '升到', self.level, '级')
end
local Warrior = setmetatable({}, { __index = Player })
Warrior.__index = Warrior
function Warrior.new(name, level, hp)
local self = Player.new(name, level)
setmetatable(self, Warrior)
self.hp = hp
return self
end
local w = Warrior.new('阿强', 10, 500)
w:levelUp() -- 阿强 升到 11 级
练习任务
- 编写玩家类(属性 + 升级方法 + 继承职业子类):基类含 name/level/levelUp;战士子类加 hp 与 attack,法师子类加 mp 与 cast。
参考:验收要点
- 子类实例能调用基类的 levelUp 方法;
- 子类重写方法时用 setmetatable(self, 子类) 保证 __index 指向子类;
- 冒号调用自动传入 self,方法内通过 self.xxx 访问属性。
本篇依据
- 《996 新三端 Lua 开发教学技术手册》课时 12
参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。