lua面向对象一直是个有趣的问题,每个人的实现方式大同小异,区别在于是否足够高效。笔者集合日常开发经验,自己撸了一套
--创建所有类的基类
local class = {}
class.__index = class --类自身作为元表,避免多余的表创建
function class:New(...)
local instance = setmetatable({}, self) --此处self代表调用New方法的类
local ctor = self.ctor
if ctor then
ctor(instance, ...) --调用初始化函数
end
return instance
end
--获取一个类,若传入BaseClass,传入的BaseClass也必须由LuaClass创建
function LuaClass(BaseClass)
local base = BaseClass or class
local cls = setmetatable({}, base)
cls.__index = cls --类自身作为元表,避免多余的{}创建
return cls
end
测试代码:
--怪物类
Monster = LuaClass()
function Monster:ctor()
print("ctor Monster")
self.damage_value = 10
end
function Monster:Atack()
print("Monster Atack, damage_value = " .. self.damage_value)
end
--Boss类,继承Monster类
Boss = LuaClass(Monster)
function Boss:ctor()
Monster.ctor(self) --调用基类的方法
print("ctor Boss")
self.damage_value = 20
end
SpecialBoss = LuaClass(Boss)
function SpecialBoss:Skill()
print("SpecialBoss Skill")
self:Atack()
end
--创建对象
local monster = Monster:New()
monster:Atack()
print("-----")
local boss = Boss:New()
boss:Atack()
print("-----")
local special_boss = SpecialBoss:New()
special_boss:Skill()
输出结果