课程入口
Lua面向对象编程(OOP)之多态
时间:2025-07-12 00:52:00
一、核心内容回顾
- 多态的定义与实现
- 定义:同一接口在不同对象上产生不同表现(如不同玩家调用
attack()
结果不同)。
- 面向过程的多态:通过函数参数动态调用(非严格OOP,但逻辑相似)。
local t = {
run = function(name, num) print(name.."跑了"..num.."米") end,
speak = function(name) print(name.."说话") end
}
t.run("张三", 100) -- 输出:张三跑了100米
- 面向对象的多态:通过继承和方法重写实现。
-- 基类
local Player = {}
function Player:new(name)
local obj = { name = name }
setmetatable(obj, { __index = self }) -- 继承基类
return obj
end
function Player:attack() print(self.name.."攻击") end
-- 子类重写方法
local Warrior = Player:new("战士")
function Warrior:attack() print(self.name.."使用剑攻击") end -- 多态表现
- 后端面向对象实战
- 链式调用:通过返回
self
实现连续操作(如player:setLevel(100):move(map, x, y)
)。
- 关键代码:
function Player:setLevel(lv)
self.level = lv
return self -- 返回自身以支持链式调用
end
function Player:move(map, x, y)
print(self.name.."移动到"..map.."("..x..","..y..")")
end
- 常见问题与调试
- 模块加载失败:检查路径和
require
/include
用法,确保文件位置正确(如./CC.lua
)。
-
self
未传递:冒号语法(:
)自动传递self
,点语法(.
)需手动传递。
- 链式调用中断:确保每个方法返回
self
或有效对象。
二、关键知识点
- 多态的核心
- 同一接口:如所有玩家都有
attack()
方法。
- 不同表现:战士用剑,法师用法术(通过子类重写实现)。
- 后端OOP优势
- 代码复用:基类封装通用逻辑(如移动、攻击)。
- 扩展性:新增职业只需派生新子类,无需修改基类。
- 链式调用:提升代码简洁性(如
player:loadData():initUI():start()
)。
- 调试技巧
- 打印中间值:用
print
检查self
和关键参数。
- 模块加载验证:在模块开头加
print("模块加载成功")
确认加载。
三、课后练习建议
- 基础练习
- 实现一个
Animal
基类,派生Dog
和Cat
子类,重写makeSound()
方法。
- 用链式调用模拟玩家
升级→换装备→进入副本
流程。
- 实战挑战
- 用OOP重构游戏后端技能系统:
- 基类
Skill
定义公共冷却时间。
- 子类
Fireball
、Heal
实现具体效果。
四、总结
- 多态是OOP的灵魂:通过继承和重写实现灵活的行为差异。
- 后端OOP可行但需谨慎:适合复杂系统(如技能、任务),简单逻辑仍可用面向过程。
- 链式调用提升效率:但需确保每个方法正确返回
self
。
代码示例已上传至群文件,建议结合调试工具逐步演练!下节课将深入抽象与设计模式,继续提升OOP实战能力! 🚀