欢迎来到天天文库
浏览记录
ID:28446401
大小:76.00 KB
页数:6页
时间:2018-12-10
《lua面向对象之类和继承浅析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Lua面向对象之类和继承浅析这篇文章主要介绍了Lua面向对象之类和继承浅析,本文讲解了一些Lua面向对象的一些知识,需要的朋友可以参考下Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下:代码如下:Account={balance=O}functionAccount.withdraw(v)Account.balance=Account.balance-vend--下面是测试调用函数Account,withdraw(100.00)在上面的withdraw函数内部依赖全局变量Account,一旦发生改变,将会导致withdraw不能正常工作,如:代
2、码如下:a=Account:Account=nila.withdraw(100.00)—将会导致访问空nil的错误。这种行为明显违反了面向对象封装性和实例独立性。要解决这一问题,我们需要给withdraw函数再添加一个参数self,他等价于java/C++中的this,如下:代码如下:functionAccount.withdraw(self,v)self,balance=self.balance-vend-下面是基于修改后代码的调用:al=Account;Account=nilal.withdraw(al,100.00)—正常工作。针对上述问题,lua提供了一种更为便
3、利的语法,即将点(.)替换为冒号(:),这样可以在定义和调用函数时隐藏参数。如:代码如下:functionAccount:withdraw(v)self,balance=self.balance-vend--调用代码可改为:a:withdraw(100.00)1、类:lua中再语言上并没有提供面向对象的支持,因此想实现该功能,我们只能通过table来模拟,如下:代码如下:--这里的lovenumber是一个公有成员变量Father={lovenumber=0}new可以视为构造函数functionFather:new(p)p=por{}—如果参数中没有提供table,则
4、创建一个空table一将新对象实例的元表指向Father,这样就可以以Father为模板了setmetatable(p,self)—将Father的_index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的keyself._index=selfreturnpendfunctionFather:toStringOprint(〃Ilovemyson!〃)end—Loving被视为公有成员函数functionFather:Loving(v)self,lovenumber=self.lovenumber+v—这里的self表示实例对象本身r
5、eturnself.lovenumberendfl=Father:new{name=//jianjiarT}f2=Father:new{name=〃baba〃,}print(f1:Loving(lOO))print(f2:Loving(200))--输出答案—100--2002、继承继承也是面向对象中一个非常重要的概念,在lua中我们也可以像模拟类那样来实现继承机制。代码如下:Father={lovenumber=0}functionFather:new(p)p=por{}—将新对象实例的元表指向Father,这样就可以以Father为模板了setmetatable(p
6、,self)—将Father的_index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的keyself._index=selfreturnpendfunctionFather:toStringOprint(〃Ilovemyson!〃)endfunctionFather:Loving(v)self.lovenumber=self.lovenumber+vreturnself.1ovenumberend—下面派生出Father的一个子类,此时的Son仍为Father的一个对象实例Son=Father:new()--重写Father中的t
7、oString方法,以实现自定义功百匕functionSon:toString()print(〃Ilovemyself!〃)end—在执行下面的new方法时,tables的元表已经是Son了,而不是Fathers=Son:new()print(s:toString())—先在子类Son中找到该方法print(s:Loving(50))—子类中无该方法,则调用父类中该方法输出答案Ilovemyself!
此文档下载收益归作者所有