Lua面向对象
lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下:
1 Account = {balance = 0}
2 function Account.withdraw(v)
3 Account.balance = Account.balance - v
4 end
5 --下面是测试调用函数
6 Account.withdraw(100.00)
在上面的withdraw函数内部依赖全局变量Account,一旦发生改变,将会导致withdraw不能正常工作,如:
1 a = Account; Account = nil
2 a.withdraw(100.00) --将会导致访问空nil的错误。
这种行为明显违反了面向对象封装性和实例独立性。要解决这一问题,我们需要给withdraw函数再添加一个参数self,他等价于java/C++中的this,如下:
1 function Account.withdraw(self,v)
2 self.balance = self.balance - v
3 end
4 --下面是基于修改后代码的调用:
5 a1 = Account; Account = nil
6 a1.withdraw(a1,100.00) --正常工作。
针对上述问题,lua提供了一种更为便利的语法,即将点(.)替换为冒号(:),这样可以在定义和调用函数时隐藏参数。如:
1 function Account:withdraw(v)
2 self.balance = self.balance - v
3 end
4 --调用代码可改为:
5 a:withdraw(100.00)
1、类:
lua中再语言上并没有提供面向对象的支持,因此想实现该功能,我们只能通过table来模拟,如下:
--这里的lovenumber是一个公有成员变量
Father={ lovenumber=} --new可以视为构造函数
function Father:new(p)
p=p or {} --如果参数中没有提供table,则创建一个空table
--将新对象实例的元表指向Father,这样就可以以Father为模板了
setmetatable(p,self)
--将Father的__index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的key
self.__index=self
return p
end function Father:toString()
print("I love my son!")
end --Loving被视为公有成员函数
function Father:Loving(v)
self.lovenumber=self.lovenumber+v --这里的self表示实例对象本身
return self.lovenumber
end f1=Father:new{name="jianjian"}
f2=Father:new{name="baba",}
print(f1:Loving())
print(f2:Loving())
--输出答案
--
--
2、继承
继承也是面向对象中一个非常重要的概念,在lua中我们也可以像模拟类那样来实现继承机制。
Father={ lovenumber=}
function Father:new(p)
p=p or {}
--将新对象实例的元表指向Father,这样就可以以Father为模板了
setmetatable(p,self)
--将Father的__index字段指向自己,以便新对象在找不到指定的key时可以被重定向,即访问Father拥有的key
self.__index=self
return p
end
function Father:toString()
print("I love my son!")
end
function Father:Loving(v)
self.lovenumber=self.lovenumber+v
return self.lovenumber
end
--下面派生出Father的一个子类,此时的Son仍为Father的一个对象实例
Son=Father:new()
--重写Father中的toString方法,以实现自定义功能
function Son:toString()
print("I love myself!")
end
--在执行下面的new方法时,table s的元表已经是Son了,而不是Father
s=Son:new()
print(s:toString()) --先在子类Son中找到该方法
print(s:Loving()) --子类中无该方法,则调用父类中该方法
--输出答案
--I love myself!
--
Lua面向对象的更多相关文章
- Lua面向对象----类、继承、多继承、单例的实现
(本文转载)学习之用,侵权立删! 原文地址 http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&a ...
- Lua面向对象之三:其它一些尝试
1.尝试一:子类对象调用被覆盖了的父类函数 根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了 ①在子类Circle中增加一个调用父类方法的函数 --调用父类被子类覆盖了的name方法 fu ...
- Lua面向对象之二:类继承
1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...
- Lua面向对象之一:简单例子
1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法) __index 赋值其实是一个fun ...
- lua面向对象封装
lua面向对象的一个封装,直接贴代码 --swfclass = {};local cs = {};function _class( child, base, ... )-- _.s( child ...
- lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)
lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...
- Step By Step(Lua面向对象)
Step By Step(Lua面向对象) Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,见如下代码: 1 Account = {balance = 0}2 function ...
- lua 面向对象
对象的特点是: 对象拥有自己的数据,两个对象即使数据完全相同,他们也是相互独立的: 对象之间可以共享对象的行为,也就是他们的方法是一致的: lua中的table就非常适合作为一个对象,可以在table ...
- Lua面向对象设计
首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...
随机推荐
- 什么是UIScrollView
移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限 当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容 普通的UIView不具备滚动功能,不适合显示过多的内容 ...
- JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- 检查PHP文件中是否含有bom的PHP函数
<?php /*检测并清除BOM*/ if(isset($_GET['dir'])){ $basedir=$_GET['dir']; }else{ $basedir = '.'; } $auto ...
- Hibernate参数一览表
参考文章地址:http://www.blogjava.net/i369/articles/194855.html Hibernate 参数设置一览表 属性名 用途 hibernate.dialect ...
- angularjs向后台传参,后台收不到数据
angularjs中封装了一个$http服务,用来请求远程资源 参见:HTTP API 其中封装过的$http.post和$http.get使用起来比较方便 后台是php,用$_POST['name' ...
- 一个漂亮的上传按钮input[type=file]
;;} <div class="input-group xj-file xj-panel-top"> <span class="input-group- ...
- MyEclipse无法删除项目下的文件
想删除老版本的jar包或文件,却怎么也删不了, 总是提示Problems encountered while deleting resources. Could not delete 后来关闭myec ...
- TCP与UDP的区别
TCP与UDP的区别 TCP面向连接:UDP是无连接,即发送数据之前不需要建立连接 TCP提供可靠的服务,TCP连接传送的数据,无差错.不丢失.不重复,且按顺序到达:UDP尽最大努力交付,即不保证可靠 ...
- <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY
MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...
- linux协议栈skb操作函数