实现的关键在于:将函数用作__index。记住,当一个表的 metatable 存在一个__index函数时,如果 Lua 调用一个原始表中不存在的函数,Lua 将调用这个__index 指定的函数。这样可以用__index 实现在多个父类中查找子类不存在的域。
代码:
local function search(k, plist)
for i = 1, table.getn(plist) do
local v = plist[i][k]
if v then return v end
end
end
function createClass(...)
local c = {}
setmetatable(c, {__index = function(t,k) local v = search(k,arg) t[k] = v return v end})
c.__index = c
function c:new(o)
print("c:new")
o = o or {}
setmetatable(o, c)
return o
end
return c
end
Named = {}
function Named:getname()
return self.name
end
function Named:setname(n)
self.name = n
end
local namedAccount = createClass(Account, Named) --Account类定义 参考 lua学习之类 文章
local account = namedAccount:new{name = "chenl"}
print(account:getname())