Lua实现类继承的一种写法

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

--[[
author:looyer@sina.com
date:2014/7/18
purpose:lua的继承演示
--]]

--- base class "Object"
local Object = {_t = "Object"}
function Object:new(id)
	local o = 
	{
		_id = id
	}
	setmetatable(o, self)
	self.__index = self

	return o
end

function Object:type()
	return self._t
end

function Object:id()
	return self._id
end

--- class "Widget" driver from "Object"
local Widget = {_t = "Widget"}
setmetatable(Widget, Object)

function Widget:new(id)
	local o = 
	{
		_id = id,
	}
	setmetatable(o, self)
	self.__index = self 
	-- function (tb, key)
	-- 	return self[key]
	-- end

	return o
end 

-- function Widget:id()
-- 	return self._id
-- end

--- class "Drawor" driver from "Object"
local Drawor = {_t = "Drawor"}
setmetatable(Drawor, Object)

function Drawor:new(id, name)
	local o = 
	{
		_id = id,
		_name = name,
	}
	setmetatable(o, self)
	self.__index = self

	return o
end

function Drawor:name()
	return self._name
end

--- class "DrawPlane" driver from "Widget" and "Drawor"
local DrawPlane = {_t = "DrawPlane", _father = {Widget, Drawor}}

function DrawPlane:new(id)
	local o = 
	{
		_id = id,
	}

	setmetatable(o, self)
	self.__index = 
	function (tb, key)
		if self[key] then return self[key] end

		for _, v in pairs(self._father) do 
			if v._t == key then return v end
			if v[key] then return v[key] end
		end
	end

	return o
end

local varA = Object:new()
local varB = Widget:new(10)
local varC = Drawor:new(30, "dwr")
local varD = DrawPlane:new(51)

print("varA type:", varA:type())
print("varB type:", varB:type())
print("varB._id: ", varB._id, varB:id())
print("varC name: ", varC:name())
print("varD type: ", varD:type())
print("varD id: ", varD:id())
print("varD father Widget--", varD.Widget:type())