local metatableOfClass = {} local ctorFuncName = 'initialize' local function new_self(classType, ...) local self = setmetatable({}, metatableOfClass[classType]) local ctorFunc = classType[ctorFuncName] if ctorFunc then ctorFunc(self, ...) end return self end local primitiveClassMT = { __index = { new = new_self } } local function new_pself(privateType, self) local pself = {} self[privateType] = pself return pself end local privateClassMT = { __index = { new_pself = new_pself } } local function new_class(className, baseClass) local classType = {} if baseClass then setmetatable(classType, { __index = baseClass }) else setmetatable(classType, primitiveClassMT) end metatableOfClass[classType] = { __index = classType } local privateType = setmetatable({}, privateClassMT) return classType, privateType end -- local A, PA = new_class('TypeA') -- function A:initialize(v) -- self.a = v -- print('A.initialize', self.a) -- end -- function A:fun1() -- print('A.fun1') -- end -- function A:fun2() -- print('A.fun2') -- end -- function PA:fun3() -- print('PA.fun3', self.a) -- end -- local B, PB = new_class('TypeB', A) -- function B:initialize(v) -- A.initialize(self, v * 2) -- print('B.initialize', self.a) -- local pself = PB:new_pself(self) -- pself.pa = v + 1 -- PB.fun3(self) -- end -- function B:fun1() -- print('B.fun1', self[PB].pa, self.a) -- end -- function PB:fun3() -- print('PB.fun3', self.a) -- PB.fun4(self) -- end -- function PB:fun4() -- local pself = self[PB] -- print('PB.fun4', self.a, pself.pa) -- end -- function B:fun5() -- print('B.fun5', self.a) -- PB.fun4(self) -- end -- local a = A:new(1) -- a:fun1() -- a:fun2() -- PA.fun3(a) -- local b = B:new(2) -- b:fun1() -- b:fun2() -- PB.fun3(b) -- PB.fun4(b) -- b:fun5() -- print('fields of TypeA') -- for k,v in pairs(A) do -- print(k, v) -- end -- print('fileds of objectA') -- for k,v in pairs(a) do -- print(k, v) -- end -- print('fields of TypeB') -- for k,v in pairs(B) do -- print(k, v) -- end -- print('fileds of objectB') -- for k,v in pairs(b) do -- print(k, v) -- end return new_class