1、先看一个简单的例子
function create(name, id)
local obj = { name = name, id = id }
function obj:SetName(name)
self.name = name
end
function obj:GetName()
return self.name
end
function obj:SetId(id)
self.id = id
end
function obj:GetId()
return self.id
end
return obj
end
o1 = create("Sam", 001)
print("o1's name:", o1:GetName(), "o1's id:", o1:GetId())
o1:SetId(100)
o1:SetName("Lucy")
print("o1's name:", o1:GetName(), "o1's id:", o1:GetId())
输出结果:
o1's name: Sam o1's id: 1
o1's name: Lucy o1's id: 100
2、几种实现对象的方式
a、对象工厂模式
如前面代码的create函数
b、用表来表示对象
把对象的数据和方法都放在一张表内,虽然没有隐藏私有成员,但对于简单脚本来说完全可以接受。
成员方法的定义
function obj:method(a1, a2, ...) … end 等价于(冒号)
function obj.method(self, a1, a2, ...) … end 等价于(点号)
obj.method = function (self, a1, a2, ...) … end
成员方法的调用
obj:method(a1, a2, …) 等价于 obj.method(obj, a1, a2, ...)
3、对象的简单继承
function createRobot(name, id)
local obj = { name = name, id = id }
function obj:SetName(name)
self.name = name
end
function obj:GetName()
return self.name
end
function obj:GetId()
return self.id
end
return obj
end
function createFootballRobot(name, id, position)
local obj = createRobot(name, id)
obj.position = "right back"
function obj:SetPosition(p)
self.position = p
end
function obj:GetPosition()
return self.position
end
return obj
end
4、函数闭包
一个函数和它所使用的所有upvalue构成了一个函数闭包。
Upvalue
一个函数所使用的定义在它的函数体之外的局部变量(external local variable)称为这个函数的upvalue。
function createCountdownTimer(second)
local ms = second * 1000
local function countDown()
ms = ms - 1
return ms
end
return countDown
end
timer1 = createCountdownTimer(1)
for i = 1, 3 do
print(timer1())
end
print("------------")
timer2 = createCountdownTimer(1)
for i = 1, 3 do
print(timer2())
end
输出结果:
999
998
997
------------
999
998
997
在前面的代码中,函数countDown使用的定义在函数createCountdownTimer中的局部变量ms就是countDown的upvalue,但ms对createCountdownTimer而言只是一个局部变量,不是upvalue。