主要通过extern.lua中的clone和class方法实现。
function clone(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end
--Create an class.
function class(classname, ...)
local function search(k,plist)
for i = 1,#plist do
local v = plist[i][k]
if v then
return v
end
end
end
local super = nil
local supers = nil
if arg.n == 1 then
super = arg[1]
else
supers = arg
end
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
end
cls.Ctor = function() 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
local tIndex = nil
if super then
cls = clone(super)
cls.super = super
tIndex = cls
elseif supers then
cls = {Ctor = function() end}
local tsu = clone(supers)
cls.super = setmetatable({}, {__index = function(t,k)
return search(k,tsu)
end})
local tcls = clone(supers)
table.insert(tcls,1,cls)
tIndex = function(t,k)
return search(k,tcls)
end
else
cls = {Ctor = function() end}
tIndex = cls
end
cls.__cname = classname
cls.__ctype = 2 -- lua
cls.__index = tIndex
function cls.new(...)
local instance = setmetatable({}, cls)
instance.class = cls
instance:Ctor(...)
return instance
end
end
return cls
end
其中clone父类是通过深拷贝保护父类信息。
继承关系为:super父类 - cls子类 - 返回示例instance(即对象)。
__index元方法作用:为子类指定父类搜索域。