Lua的面向对象实现方式

来源:互联网 发布:淘宝手工护肤良心店 编辑:程序博客网 时间:2024/05/17 23:22

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 objend
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: 1o1'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 objendfunction 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 objend

4、函数闭包

一个函数和它所使用的所有upvalue构成了一个函数闭包。

Upvalue
一个函数所使用的定义在它的函数体之外的局部变量(external local variable)称为这个函数的upvalue。

function createCountdownTimer(second) local ms = second * 1000 local function countDown() ms = ms - 1 return ms end return countDownendtimer1 = createCountdownTimer(1)for i = 1, 3 do print(timer1())endprint("------------")timer2 = createCountdownTimer(1)for i = 1, 3 do print(timer2())end输出结果:999998997------------999998997

在前面的代码中,函数countDown使用的定义在函数createCountdownTimer中的局部变量ms就是countDown的upvalue,但ms对createCountdownTimer而言只是一个局部变量,不是upvalue。






0 0
原创粉丝点击