在函数createClass中实现多继承的功能。函数中c是一个中间元表,通过他可以访问父类表Account,Named.
主要是通过对__index方法重写,让它调用search()函数,并在plist表中分别对Account,Named表进行查找,
看是否有k = name 的键值存在,存在就直接返回v。
Account = {}
function Account:getbalance()
return self.balance
end
function Account:setbalance(m)
self.balance = m
end
Named = {}
function Named:getname()
return self.name
end
function Named:setname(m)
self.name = m
end
function createClass(...)
local c = {}
function search(k,plist)
for i = 1, #plist do
v = plist[i][k]
if v then return v end
end
end
local parent = {...}
setmetatable(c,{__index = function(t,k) —实现多继承
return search(k,parent)
end
})
c.__index = c
function c:new(o)
o = o or {}
setmetatable(o,self)
self.__index = self
return o
end
return c
end
nameaccount = createClass(Account,Named) — 创建中间传递表,name account的元表指向search方法。
s = nameaccount:new{name = "paul”} — s的元表是name account
print(s:getname()) —根据元表的传递性,s先在自己表找,没有get name方法,就到它执行的元表name account
中找(因为nameaccount指向自己);还没找到到name account的元表执行的search方法找。
总结:多继承,就是重写__index方法,让他指向一个包含有多个表的表(像这种:{{},{},{}}),在对这个表一个一个
的遍历查找包含k的v。找到就返回。
上例中s就是zhongj
主要是通过对__index方法重写,让它调用search()函数,并在plist表中分别对Account,Named表进行查找,
看是否有k = name 的键值存在,存在就直接返回v。
Account = {}
function Account:getbalance()
return self.balance
end
function Account:setbalance(m)
self.balance = m
end
Named = {}
function Named:getname()
return self.name
end
function Named:setname(m)
self.name = m
end
function createClass(...)
local c = {}
function search(k,plist)
for i = 1, #plist do
v = plist[i][k]
if v then return v end
end
end
local parent = {...}
setmetatable(c,{__index = function(t,k) —实现多继承
return search(k,parent)
end
})
c.__index = c
function c:new(o)
o = o or {}
setmetatable(o,self)
self.__index = self
return o
end
return c
end
nameaccount = createClass(Account,Named) — 创建中间传递表,name account的元表指向search方法。
s = nameaccount:new{name = "paul”} — s的元表是name account
print(s:getname()) —根据元表的传递性,s先在自己表找,没有get name方法,就到它执行的元表name account
中找(因为nameaccount指向自己);还没找到到name account的元表执行的search方法找。
总结:多继承,就是重写__index方法,让他指向一个包含有多个表的表(像这种:{{},{},{}}),在对这个表一个一个
的遍历查找包含k的v。找到就返回。
上例中s就是zhongj