-- 类工厂 localfunctionclass(base) local cls = {} -- 如果有基类,从基类继承 if base then setmetatable(cls, {__index = base}) end -- 构造器 cls.__index = cls -- 让实例可以访问类的属性 cls.__class = cls -- 记录类本身 functioncls:new(...) local obj = {} setmetatable(obj, {__index = self}) -- 调用初始化方法(如果存在) if obj.init then obj:init(...) end return obj end return cls end
-- 使用类工厂 local Animal = class()
functionAnimal:init(name, sound) self.name = name or"动物" self.sound = sound or"..." end
functionAnimal:speak() print(self.name .. ": " .. self.sound) end
localfunctioninstance_of(obj, cls) local meta = getmetatable(obj) ifnot meta thenreturnfalseend local current = meta.__index while current do if current == cls thenreturntrueend local parent_meta = getmetatable(current) current = parent_meta and parent_meta.__indexornil end returnfalse end
localfunctionmulti_class(...) local parents = {...} local cls = {} cls.__class = cls cls.__index = function(obj, key) -- 先在自己的静态属性中查找 if cls[key] ~= nilthen return cls[key] end -- 在所有父类中查找 for _, parent inipairs(parents) do local value = parent[key] if value ~= nilthen -- 如果是函数,绑定到当前对象 iftype(value) == "function"then returnfunction(...) return value(obj, ...) end end return value end end returnnil end functioncls:new(...) local obj = {} setmetatable(obj, {__index = self.__index}) if obj.init then obj:init(...) end return obj end return cls end
-- 定义两个基类 local Flyable = class() functionFlyable:fly() print(self.name .. " 在飞") end
local Swimmable = class() functionSwimmable:swim() print(self.name .. " 在游泳") end
-- 多继承 local Duck = multi_class(Flyable, Swimmable) functionDuck:init(name) self.name = name or"鸭子" end
local d = Duck:new("唐老鸭") d:fly() --> 唐老鸭 在飞 d:swim() --> 唐老鸭 在游泳
-- class.lua localfunctionclass(base) local cls = {} cls.__class = cls if base then setmetatable(cls, {__index = base}) end cls.__index = cls functioncls:new(...) local obj = {} setmetatable(obj, {__index = self}) if obj.init then obj:init(...) end return obj end return cls end
-- 使用示例:图形类体系 local Shape = class()
functionShape:init(name) self.name = name or"形状" end
functionShape:area() return0 end
functionShape:describe() returnstring.format("%s 的面积是 %.2f", self.name, self:area()) end