多重继承
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。


首页 我的博客
粤ICP备17103704号