课程入口
Lua面向对象编程(OOP)课程总结
时间:2025-07-12 00:50:33
一、核心内容回顾
- 原表(Metatable)与原方法(Metamethod)
- 原表的作用:通过
setmetatable
绑定到普通表,扩展表的行为(如运算符重载、自定义索引等)。
- 常用原方法:
__index
:当访问表中不存在的键时触发(用于继承)。
__newindex
:当修改表中不存在的键时触发(类似“拦截器”)。
__add
/__sub
等:重载运算符(如a + b
)。
- 关键代码示例:
local t = {}
setmetatable(t, {
__newindex = function(tbl, key, value)
print("拦截修改!", key, value)
rawset(tbl, key, value) -- 绕过原方法直接赋值
end
})
t.name = "张三" -- 触发__newindex
- 面向对象四大特性
- 封装:将数据和方法绑定到表,隐藏实现细节(如局部变量、闭包)。
- 继承:通过
__index
实现子类继承父类属性和方法。
- 多态:同一方法在不同对象中表现不同行为(如不同玩家攻击力不同)。
- 抽象:定义接口规范(如“玩家可攻击”这一概念)。
- 继承的实现
二、关键细节与注意事项
-
__newindex
的陷阱
- 若在
__newindex
内直接赋值(如tbl[key] = value
),会递归触发原方法导致栈溢出,必须用rawset
绕过。
- 继承中的
self
指向
- 子类方法中
self
指向当前实例,通过__index
链向上查找父类属性(类似原型链)。
- 多态的实际应用
- 同一方法(如
attack()
)因对象属性不同产生不同结果(如攻击力、技能等级差异)。
- 面向对象的适用场景
- 前端:推荐使用(如UI组件、角色控制)。
- 后端:谨慎使用,初期建议面向过程,熟练后再引入OOP。
三、课后练习建议
- 基础练习
- 实现一个
Vector
类,重载__add
实现向量相加。
- 用
__newindex
创建一个只读表(禁止修改已有键)。
- 进阶挑战
- 设计
Player
基类,派生Warrior
和Mage
子类,各自实现attack()
方法。
- 通过闭包封装私有属性(如
local _hp = 100
,外部不可直接访问)。
四、总结
- 原表是Lua OOP的核心,通过
__index
和__newindex
实现继承与封装。
- OOP四大特性需结合实战理解(如游戏中的角色系统)。
- 避免过度设计:简单逻辑直接用面向过程,复杂模块再考虑OOP。
代码实例已上传至群文件,建议结合群内视频(公告)对照学习。下节课重点讲解多态与实战应用!