首页 > 代码库 > Chapter 16_0 面向对象编程
Chapter 16_0 面向对象编程
Lua中的table就是一种对象。
1、table和对象一样拥有状态
2、和对象一样有一个独立的标识符(a self)
3、和对象一样,具有独立于创建者和创建地的生命周期。
对象有他们自己的操作,table同样也有:
Account = {balance = 0}function Account.withdraw(v) Account.balance = Account.balance -v end
有了上面的定义,可以这样调用:
Account.withdraw(100.00)
这种函数就是所谓的“方法(Method)”,不过在函数里面使用全局Account是一个不好的编程习惯。
因为这个函数只能针对特定对象工作。并且,这个特定对象还必须存储在特定的全局变量中。
如果改变了对象的名称,withdraw就再也不能工作了:
a,Account = Account,nila.withdraw(100.00) -- Error !
这种行为违反了前面提到的对象特性,即对象拥有独立的生命周期。
有一种灵活的方法,即指定一项操作所作用的“接受者”。因此需要一个额外的参数来表示该接受者。通常为self或this:
function Account.withdraw(self, v ) self.balance = self.balance - vend
再去调用该方法,必须指定其作用的对象:
a1 = Account ; Account = nil...al.withdraw(a1, 100.00) -- OK
通过self参数,可以在多个对象中使用同样的方法。
a2 = {balance = 0 , withdraw = Account.withdraw}...a2.withdraw(a2, 260.00)
其实不用显式地声明这个参数,Lua中只需要使用冒号:
function Account:withdraw(v) self.balance = self.balance -v end
方法调用:
a:withdraw(100.00)
可以用点语法来定义一个函数,并用冒号语法去调用。反之,只要能正确处理好哪个额外的参数即可:
Account = { balance = 0, withdraw = function(self, v) self.balance - v end }function Account:deposit(v) self.balance = self.balance + vendAccount.deposit(Account, 200.00)Account:withdraw(100.00)
现在的对象已有一个标识、一个状态和状态之上的操作。还缺乏一个类(class)系统、继承和私密性(privacy)。
接下来的小结,将会介绍如果创建多个具有类似行为的对象,即如何创建多个account账户对象。
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》
Chapter 16_0 面向对象编程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。