Skip to content

Instantly share code, notes, and snippets.

@losophy
Created May 24, 2021 12:53
Show Gist options
  • Save losophy/e8c97ec76fd9100b576ff158714eb9f7 to your computer and use it in GitHub Desktop.
Save losophy/e8c97ec76fd9100b576ff158714eb9f7 to your computer and use it in GitHub Desktop.
lua类的实现
function class(classname, super)
--superType获取父类类型,可以使nil、function以及table.
local superType = type(super)
local cls
--如果父类既不是函数也不是table则说明父类为空
if superType ~= "function" and superType ~= "table" then
superType = nil
super = nil
end
--如果父类的类型是函数或者是C对象
if superType == "function" or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {}
--如果父类是表则复制成员并且设置这个类的继承信息
if superType == "table" then
-- 从父类copy 字段
print ("superTyper is table");
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else --如果是函数类型则设置构造方法并且设置ctor函数
cls.__create = super
cls.ctor = function() end
end
--设置类型的名称
cls.__cname = classname
cls.__ctype = 1
--定义该类型的创建实例的函数为基类的构造函数后复制到子类实例
--并且调用子数的ctor方法
function cls.new(...)
local instance = cls.__create(...)
-- copy fields from class to native object
for k,v in pairs(cls) do instance[k] = v end
instance.class = cls
instance:ctor(...)
return instance
end
else
--如果是继承自普通的lua表,则设置一下原型,并且构造实例后也会调用ctor方法
-- inherited from Lua Object
if super then
cls = {}
setmetatable(cls, {__index = super})
cls.super = super
else
cls = {ctor = function() end}
end
cls.__cname = classname
cls.__ctype = 2 -- lua
cls.__index = cls
function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance:ctor(...)
return instance
end
end
return cls
end

lua.class

这是cocos2d-x自己给出的lua类的实现,也即在luaBinding目录下extern.lua的文件中给出的实现。

关于lua类的实现

lua面向对象

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment