私有性
私有性也被称为信息隐藏是一门面向对象语言不可获取的一部分:每个对象的状态都应该由它自己控制。
Lua语言为程序员提供能够模拟许多不同机制的元机制(meta-mechanism)。这种做法的基本思想是通过两个表来表示一个对象:一个表用来保存对象的状态,另一个表用于保存对象的操作(或接口)。我们通过第二个表来访问对象本身,即通过组成其借口的操作来访问。为了避免未授权的访问,表示对象状态的表不保存在其他表的字段中,而只保存在方法的闭包中。
function newAccount (initialBalance)
local self = {balance = initialBalance}
local withdraw = function (v)
self.balance = self.balance - v
end
local depoit = function (v)
self.balance = self.balance + v
end
local getBalance = function() return self.balance end
return {
withddraw = withdraw,
deposit = deposit,
getBalance = getBalance
}
end
首先这个函数创建了一个用于保存对象内部状态的表,并将其存储在局部变量self中。然后,这个函数创建了对象的方法(接口)。最后,这个函数会创建并返回一个外部对象,该对象将方法名与真正的方法实现映射起来。这里的关键在于,这些方法不需要额外的self参数,而是直接访问self变量。由于没有了额外的参数,我们也就无须使用冒号语法来操作这些对象,而是可以像普通函数那样调用这些方法。
acc1 = newAccount(100.00)
acc1.withdraw(40.00)
print(acc1.getBalance()) -->60
这种设计给予了存储在表self中所有内容完全的私有性。当newAccount返回后,就无法直接访问这个表了,我们只能通过在newAccount中创建的函数来访问它。我们还可也将一个对象的所有私有部分都存入这个表。我们也可以定义私有方法,它们类似于公有方法但不放入接口中。
function newAccount (initialBalance)
local self = {
balance = initialBalance,
LIM = 10000.00
}
local extra = function ()
if self.balance > self.LIM then
return self.balance * 0.10
else
return 0
end
end
local getBalance = function()
return self.balance = extra()
end
与前一个示例一样,任何用户都无法直接访问extra函数和LIM字段。