local function search(k,plist) for i=1,#plist do local v = plist[i][k] if v then return v end end end function createClass(...) local o = {} local parents = {...} setmetatable(o,{__index=function(t,k) local v = search(k,parents) t[k] = v return v end }) o.__index = o function o:new(p) p = p or {} setmetatable(p,o) return p end return o end Named = {} Named.a = 10 Tell = {} Tell.b = 50 Acc = createClass(Named,Tell) acc = Acc:new() print(acc.b)
多重继承的话就不能通过某一个类来创建新的类型了,需要通过第三方的方法来创建类,参数传入基类们,创建一个新的table,它的元方法为可以在基类们中搜索对应值的search方法,缓存基类方法到具体的table(缺点是运行时修改基类的方法不会向下传递了,优点是访问加快了),为新table(类)提供一个new方法来创建对象,就是设置新table类为新新table的元表的__index。