您的位置:首页 > 编程语言 > Lua

Lua学习笔记(4)--继承的尝试(1)

2012-07-03 15:13 176 查看
最近有个任务,要为一个游戏写一个连续登陆奖励的功能,即是根据用户连续登陆游戏的天数给予相应的奖励,这款游戏的代码风格很好,对很多有共性的面板都进行了封装,让代码的复用性很高,那么在做这个连续登陆面板的时候我也想将这个UI封装,一是因为这个功能相对整个游戏比较独立,二是我是新手,刚好拿这样的一个功能来练手,那么我们首先要了解怎么样在Lua中达到面相对象的效果,Lua中提供了元表和元方法这样的操作,可以通过这个达到继承的效果,摘录《Lua程序设计第二版》的一段话:

可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作。例如,假设a和b都是table,通过元表可以定义如何计算表达式a+b。当Lua试图将两个table相加时,它会先检查两者这一是否有元表,然后检查该元表中是否有一个叫__add的字段。如果Lua找到了该字段,就调用该字段对应的值。这个值也就是所谓的"元方法",它应该是一个函数,在本例中,这个函数用于计算table的和。

上一段代码:

a = {}
b = {}
function a:new()
local at = {}
setmetatable(at, self)
self.__index = self
return at
end

function a:printf()
print("this is a's function")
for i,e in ipairs(self) do
e:printf()
print("this is a")
end
end

function b:new(bt)
bt = bt or {}
setmetatable(bt, self)
self.__index = self
return bt
end

function b:printf()
print("this is b's function")
--	if self or self.printf then self.printf() end
end

c = {}
c = a:new()--(1)
c:printf()
c[#c+1] = b:new{printf = function() print("I don't know") end}--(2)
c:printf()
c[#c+1] = b:new()--(3)
c:printf()


在这里,a和b都是两个元表,a和b的new方法都会创建一个表,并为这个新表指定a或b为其元表,(1)中new了后c里面并没有printf这个字段,那么,在执行下面的c:printf()的时候,c会去查找元表是否有这么一个字段,找到了,这是打印出了

this is a's function

self中没有值就没有继续打印下面的了

(2)中new 了之后,查找元表,执行的是a:printf(),输出了

this is a's function --而这次c里面有printf这个字段,接着输出了

I don't know

this is a

(3)中new了之后,查找元表,执行的是a:printf(),输出了

this is a's function--接着是c[2]中的数据

I don't know

this is a--接着才是c[3]的内容

this is b's function--因为c[3]中没有printf这个字段,所以执行了b:printf()

this is a

最后全部的输出如下:

>lua -e "io.stdout:setvbuf 'no'" "cfg_Puppy.lua"
this is a's function
this is a's function
I don't know
this is a
this is a's function
I don't know
this is a
this is b's function
this is a
>Exit code: 0


如果把c = b:new()这样的语句放在c = a:new()之前的话,那么所有的printf都是从b中所定义的开始执行,只是在碰到self的时候会回到自己原本的元表去执行相应的逻辑。

从这样的一个改动之后的现象来看,虽然本例之后c中也有部分内容是从b中new出来的,但是执行的时候还是以第一个new出来的地方确定为它的元表,之后不改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua function bt table 游戏 c