在lua里实现常量_类_继承_多态

 
------------------------------------------------ GameMap.lua -----------------------------------------------------
--[[
 file name : 	GameMain.lua
 author  :  	Clark/陈泽丹
 created :  	8:8:2011
 purpose :  	实现常量表功能,  类功能, 继承功能, 多态功能
--]]

module("GameMap", package.seeall) -- "GameMap"为用户定义的包名,包名需与其所在的文件名同名。 调用本文件里语法: packMap = require"GameMap"


function newConst( const_table )	--生成常量表功能
	function Const( const_table )
		local mt =
		{
			__index = function (t,k)
				return const_table[k]
			end,
			__newindex = function (t,k,v)
				print("*can't update " .. tostring(const_table) .."[" .. tostring(k) .."] = " .. tostring(v))
			end
		}
		return mt
	end

	local t = {}
	setmetatable(t, Const(const_table))
	return t
end
--[[
常量表功能的使用举例:
function NEW_CONST_DEFINE() --生成自定义常量表
	local PAR_TABLE =
	{
		MAPNAME = "冰星",
		MONSTER = newConst({"哥斯拉", 1, 1}),	--表项为常量的也需声明为常量表
	}
	local t = newConst(PAR_TABLE)
	return t
end
--]]


function newBaseMap(mapName, mapID)
	local objMap =
	{
		m_pMap = mapName,             						--创建地图
		m_ID = mapID                    						--记录地图ID
	}
	function objMap:deleteMap()								--消毁地图
		self.m_pMap = nil
		self.m_ID = nil
	end
	function objMap:showMap()
		if nil ~= self.m_pMap and nil ~= self.m_ID then
			print(self.m_pMap, self.m_ID)
		end
	end
	return objMap
end

-- 怪物地图类
function newMonsterMap(mapName, mapID)
	local objMap = newBaseMap(mapName, mapID)							--继承
	objMap.m_Monsters = {}
	function objMap:buildMonster(monsterName, posX, posY)						--创建怪物
		self.m_Monsters[#self.m_Monsters+1] = { m_Name = monsterName, m_posX = posX, m_posY = posY }
	end
	function objMap:deleteMonsterMap()						--消毁地图
		self:deleteMap()
		objMap.m_Monsters = nil
	end
	local funTemp = objMap.showMap 						--多态函数
	function objMap:showMap()
		funTemp(self)
		if nil ~= self.m_Monsters then
			for i=1, #self.m_Monsters do
				print(self.m_Monsters[i].m_Name, self.m_Monsters[i].m_posX, self.m_Monsters[i].m_posY)
			end
		end
	end
	return objMap
end


 
------------------------------------------------ GameMain.lua -----------------------------------------------------
packMap = require"GameMap"
print("----------------------------------Game Main-----------------------------------")


function NEW_CONST_DEFINE() --生成自定义常量表
	local PAR_TABLE =
	{
		MAPNAME = "冰星",
		MAPID = 999,
		MONSTER1 = packMap.newConst({"哥斯拉", 1, 1}),	--表项为常量的也需声明为常量表
		MONSTER2 = packMap.newConst({"小强",2,2}),
		MONSTER3 = packMap.newConst({"史锐克",3,3})
	}
	local t = packMap.newConst(PAR_TABLE)
	return t
end

--获得自定义常量表
CONST_MAP = NEW_CONST_DEFINE()

--尝试更改表中变量
CONST_MAP.MAPNAME = "jjjj"
CONST_MAP.MAPID = 777
CONST_MAP.MONSTER1[1] = "ccc"
CONST_MAP.MONSTER2 = {"小强fff",33,44}



map = packMap.newMonsterMap(CONST_MAP.MAPNAME, CONST_MAP.MAPID)
map:buildMonster(CONST_MAP.MONSTER1[1], CONST_MAP.MONSTER1[2], CONST_MAP.MONSTER1[3])
map:buildMonster(CONST_MAP.MONSTER2[1], CONST_MAP.MONSTER2[2], CONST_MAP.MONSTER2[3])
map:buildMonster(CONST_MAP.MONSTER3[1], CONST_MAP.MONSTER3[2], CONST_MAP.MONSTER3[3])
map:showMap()


map:deleteMonsterMap()
map:showMap()

 

 

运行结果:
>lua -e "io.stdout:setvbuf 'no'" "GameMain.lua"
----------------------------------Game Main-----------------------------------
*can't update table: 003B9A40[MAPNAME] = jjjj
*can't update table: 003B9A40[MAPID] = 777
*can't update table: 003BAC98[1] = ccc
*can't update table: 003B9A40[MONSTER2] = table: 003B7E48
冰星 999
哥斯拉 1 1
小强 2 2
史锐克 3 3
>Exit code: 0

 

 



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值