Lua的面向对象实现方式

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。






你可能感兴趣的:(lua)