实现代码
function class(classname, super)
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 = {};
--如果父类是表则复制成员并且设置这个类的继承信息
--如果是函数类型则设置构造方法并且设置ctor函数
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;
--定义该类型的创建实例的函数为基类的构造函数后复制到子类实例
--并且调用子数的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;
if cls.super ~= nil then
cls.super.ctor(instance,...);
end;
instance:ctor(...);
return instance;
end;
end;
return cls;
end;
解析
1.super的类型: superType = type(super)
2.superType可以为 function
, table
,当不为这两种类型的时候我们将之置为nil
3.superType为 function
的时候,表示从C++对象继承
4.superType为 table
的时候,还要看其 __ctype
值,1表示继承自C++对象;2表示继承自lua表对象
5.superType为 nil
的时候,从lua表继承
一般情况下,superType为function的时候,表示继承的是一个C++对象,这个时候构造函数ctor里不需要调用父类的构造函数;其它情况,一般都需要在ctor里调用父类的构造函数。