课时 12 · 面向对象编程

课时 12 · 面向对象编程(Lua 进阶):用表与元表模拟类与继承。含可运行的示例代码、练习与验收要点,示例锁定 Lua 5.1,可在站内在线运行验证。

教程/第二部分 · Lua 进阶更新于 2026-10-073 个小节 教程第 15 / 23 篇 Lua进阶

本课的代码可以就地复制;点代码块右上角的「运行这段」, 会带着这段代码打开 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

参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。