Cocos2d-x之lua核心编程(第二版)》示例代码注释详解 3

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

##用表模拟面向对象编程中的类和对象

1 用元表实现一个People类

 1People = {age = 18}
 2
 3--[[
 4等同于这样的声明方式:
 5function People.new(self) self就是People表本身
 6--]]
 7function People:new()
 8    local p = {}             -- 生成一个表p
 9    setmetatable(p, self)    -- 表p的元表设置为表People
10    self.__index = self      --[[ 表People的__index值就是__People本身。前文说到,__index对应的值可以是
11                                  一个table也可以是一个table。现在以一个table作为__index的值 --]]
12    return p
13end
14
15function People:growUp()
16    self.age = self.age + 1
17    print(self.age)
18end
19
20-- 测试
21p1 = People:new()
22
23--[[
24p1:growUp()的调用等价于:p1.growUp(p1)。这个语句的执行可以分解为以下的一些步骤:
25
261 首先要拿到函数p1.growUp。从People:new函数中可以知道:p1就是People:new函数中的p,一开始就是一个空表,
27但这个空表p的元表就是表People,且空表p的元表People表的__index方法就是它自己,这也就是说。虽然p表是一个空表,
28但是当执行到p1.growUp时,会查找执行到People.growUp的函数去执行之。
29
302 得到了People.growUp函数之后执行值,这里p1:growUp()的调用方式是等价于People.growUp(p1)。在growUp函数内部
31当执行到self.age = self.age+1语句时,一开始的p1表中没有age项目,但执行语句后,首先会从People表中复制一份age项到
32p1表,然后再对p1自身的age项加1.所以输出19。p2也是遵循这个“复制一份age项到p2表”的操作,故而最后也是输出19
33--]]
34p1:growUp() -- 输出19
35
36p2 = People:new()
37p2:growUp() -- 输出19

###2 在People类的基础上定义Man类

 1People = {age = 18}
 2
 3function People:new()
 4    local p = {}
 5    setmetatable(p, self)
 6    self.__index = self
 7    return p
 8end
 9
10function People:growUp()
11    self.age = self.age + 1
12    print("People's growUp:" .. self.age)
13end
14
15--[[
16表Man等同于类People的一个实例对象。Man:growUp调用了People.growUp(self)函数。
17执行Man:growUp函数,输出的语句为:
18People's growUp:19
19--]]
20Man = People:new()
21Man:growUp()
22
23--[[
24表Man可以视为类People的一个实例对象,但也可以视为一个类Man。下面的语句定义了growUp
25函数,其实也就是等同于重载了People类的growUp函数了
26--]]
27function Man:growUp()
28    self.age = self.age + 1
29    print("Man's growUp:" .. self.age)
30end
31
32-- 测试
33man1 = Man:new() --[[ 执行的是People.new函数,但这时候,表man1的元表为表Man,注意这时候
34                  的表Man中已经有age属性了,而且age值为19--]]
35man1:growUp() --[[ 表man1执行的是Man.growUp(self)函数,所以执行这函数输出为:
36                 Man's growUp:20 --]]

###3 同一个表先后对应于两个不同的对象实例

 1People = {age = 18}
 2
 3function People:new()
 4    local p = {}
 5    setmetatable(p, self)
 6    self.__index = self
 7    return p
 8end
 9
10function People:growUp()
11    self.age = self.age + 1
12    print("People's growUp:" .. self.age)
13end
14
15Man = People:new()
16
17function Man:growUp()
18    self.age = self.age + 1
19    print("Man's growUp:" .. self.age)
20end
21
22--[[
23People:new()方法和Man:new()方法都是两个不同的实例对象,且Man表自身没有执行过Man:growUp方法。
24因此。先后两次的person:growUp方法的执行,分别显示了以下的两个语句:
25People's growUp:19
26Man's growUp:19
27--]]
28person = People:new()
29person:growUp()
30person = Man:new()
31person:growUp()

返回首页