每个Lua脚本开头都会有 local ClassName = class("className", super)
class()方法的具体实现也很简单,重点还是new()方法,其中会自动调用创建类的ctor()方法,话不多说,直接上代码
function class(classname, super)
local superType = type(super)
local cls
if superType ~= 'function' and superType ~= 'table' then
superType = nil
super = nil
end
if superType == 'function' or (super and super.__ctype == 1) then
-- inherited from native C++ Object
cls = {}
if superType == 'table' then
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end
cls.__create = super.__create
cls.super = super
else
cls.__create = super
cls.ctor = function() end
end
cls.__cname = classname
cls.__ctype = 1
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
-- 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
if instance.ctor ~= nil then
instance:ctor(...)
end
return instance
end
end
return cls
end
本文详细解释了Lua中的class函数如何创建类,重点在于new方法,涉及super类型判断、继承自C++对象与Lua对象的区别,以及metatable的使用。
1万+

被折叠的 条评论
为什么被折叠?



