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都是两个元表,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
最后全部的输出如下:
如果把c = b:new()这样的语句放在c = a:new()之前的话,那么所有的printf都是从b中所定义的开始执行,只是在碰到self的时候会回到自己原本的元表去执行相应的逻辑。
从这样的一个改动之后的现象来看,虽然本例之后c中也有部分内容是从b中new出来的,但是执行的时候还是以第一个new出来的地方确定为它的元表,之后不改变。
可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作。例如,假设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学习笔记(5)--继承的尝试(2)
- Lua学习笔记5:类及继承的实现
- Lua学习笔记之——类与继承的简单实现
- Lua学习笔记5:类及继承的实现
- 【学习笔记】lua中基于原型的继承
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
- DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试
- cocos-lua基础学习(八)Layer类学习笔记
- Java学习笔记_005_封装与继承
- ASP.NET控件开发学习笔记--第7回 从WebControl继承
- lua学习笔记 1 android 调用Lua, Lua脚本中启动Intent
- 【学习笔记】类的继承
- [LUA学习笔记03]LUA函数和C函数的相互调用
- 继承类的练习 学习笔记 2
- Lua学习笔记 第十章 完整的示例
- lua学习笔记4之语法
- JavaScript学习笔记_构造函数的继承
- Lua 学习笔记(九) ——数据文件与持久性
- C++学习笔记-类的继承(派生类)
- Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)