这是cocos2d-x自己给出的lua类的实现,也即在luaBinding目录下extern.lua的文件中给出的实现。
Created
May 24, 2021 12:53
-
-
Save losophy/e8c97ec76fd9100b576ff158714eb9f7 to your computer and use it in GitHub Desktop.
lua类的实现
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment