标签:style blog http io ar color os 使用 sp
function newAccount (initialBalance) local self = { balance = initialBalance } local withdraw = function (v) self.balance = self.balance - v end local deposit = function (v) self.balance = self.balance + v end local getBalance = function () return self.balance end return { withdraw = withdraw, deposit = deposit, getBalance = getBalance } end acc1 = newAccount(100.00) acc1.withdraw(40.00) print(acc1.getBalance()) -- 60 acc1.deposit(40) print(acc1.getBalance()) -- 100 print(acc1.balance) -- nil
首先,函数创建一个表用来描述对象的内部状态,并保存在局部变量self内。然后,函数为对象的每一个方法创建闭包(也就是说,嵌套的函数实例)。最后,函数创建并返回外部对象,外部对象中将局部方法名指向最终要实现的方法。这儿的关键点在于:这些方法没有使用额外的参数self,代替的是直接访问self。因为没有这个额外的参数,我们不能使用冒号语法来访问这些对象。函数只能像其他函数一样调用: acc1.deposit(40) acc1.getBalance()
这种设计实现了任何存储在self表中的部分都是私有的,newAccount返回之后,没有什么方法可以直接访问对象,我们只能通过newAccount中定义的函数来访问他。虽然我们的例子中仅仅将一个变量放到私有表中,但是我们可以将对象的任何的部分放到私有表中。我们也可以定义私有方法,他们看起来象公有的,但我们并不将其放到接口中。例如,我们的账号可以给某些用户取款享有额外的10%的存款上限,但是我们不想用户直接访问这种计算的详细信息,我们实现如下:
1 function newAccount (initialBalance)
2 local self = { balance = initialBalance ,
3 LIM = 1314 }
4
5 local withdraw = function (v)
6 self.balance = self.balance - v
7 end
8
9 local extra = function ()
10 if self.balance > self.LIM then
11 return self.balance*0.10
12 else
13 return 0
14 end
15 end
16
17 local deposit = function (v)
18 self.balance = self.balance + v
19 end
20
21 local getBalance = function ()
22 return self.balance + extra() --[此处非self.extra()]
23 end
24
25 return {
26 withdraw = withdraw,
27 deposit = deposit,
28 getBalance = getBalance,
29 -- extra = extra,
30 }
31 end
这样,对于用户而言就没有办法直接访问extra函数了;如此 也就实现lua private function。
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/jadeboy/p/4131674.html