Lua学习----面向对象编程
1.类
再Lua中可以使用表和函数实现面向对象,将函数和相关的数据放置放置于同一个表中就形成了对象。例如:
Measure = {width = 0, height = 0} function Measure:setWifth(v)
self.width = self.width + v
end function Measure:setHeight(v)
self.height = self.height + v
end function Measure:getMeasure()
print(self.width * self.height)
end function Measure:new(o)
o = o or {}
setmetatable(o, {__index = self})
return o
end local a = Measure:new()
a:setHeight(100)
a:setWifth(5)
a:getMeasure()
上面这段代码"setmetatable(o, {__index = self})"这句话值得注意,根据再元表一章的学习,我们知道,这里的setmetatable负责创建o表的原型,当o在自己的表内找不到相应的方法时,便会到__index所指定的Measure类型中去寻找。
2.继承
继承可以用元表实现,它提供在父类中查找存在的方法和变量机制。
继承分为单继承和多重继承。
单继承:
childMeasure = Measure:new()
function childMeasure:setHeight(v)
self.height = self.height + v * 2
end function childMeasure:setWidth(v)
self.width = self.width + v * 2
end local area = childMeasure:new()
area:setHeight(100)
area:setWidth(5)
area:getMeasure()
多重继承:
在多重继承中,我们自己利用'__index'元方法定义恰当的访问行为。
如下,定义__index:
local function search (k, plist)
for i=1, #plist do --注意 ,教程里面使用的是table.getn(plist),是有问题的,因为plist是一个table数组,并不是一个table-table类型,所以使用table.getn会报错,改成求数组的长度就可以了
local v = plist[i][k] -- try 'i'-th superclass
if v then return v end
end
end
function createClass (...)
local c = {} -- new class
args = {...}
setmetatable(c, {__index = function (self, k)
return search(k, args)
end})
c.__index = c
function c:new (o)
o = o or {}
setmetatable(o, c)
return o
end
return c
end
使用方法:
Named = {}
function Named:getname ()
return self.name
end
function Named:setname (n)
self.name = n
end NameMeasure = createClass(Measure, Named)
mmm = NameMeasure:new{name = "fdfdsf"}
print(mmm:getname())
mmm:setHeight(60)
mmm:setWidth(5)
mmm:getMeasure()
注意:多重继承是有顺序的,根据createClass参数的顺序,如果两个类中存在相同的方法或者数据,则优先使用第一个参数的方法和数据。这一点可以从下面的代码中看出:
local function search (k, plist)
for i=1, #plist do --注意 ,教程里面使用的是table.getn(plist),是有问题的,因为plist是一个table数组,并不是一个table-table类型,所以使用table.getn会报错,改成求数组的长度就可以了
local v = plist[i][k] -- try 'i'-th superclass
if v then return v end
end
end
Lua学习----面向对象编程的更多相关文章
- Lua 之面向对象编程
Lua 之面向对象编程 Lua并不是为面向对象而设计的一种语言,因此,仅从原生态语法上并不直接支持面向对象编程,但Lua的设计中仍然包含了很多面向对象的思想,理解它们也更有助于理解Lua自身的一些高级 ...
- 学习面向对象编程OOP 第二天
好,今天继续学习这个面向对象编程.(根据博客园 小炒花生米写的博客学习而来) 一,封装性 a.把对象的全部属性和全部服务(方法)结合在一起,形成一个不可分割的独立单元 =>对象 b.信息隐蔽,尽 ...
- 学习面向对象编程OOP 第一天
面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...
- python 学习 面向对象编程
面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...
- python学习——面向对象编程
关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261
- 【Lua】面向对象编程(二)
多重继承: module(...,package.seeall) local function search(k,plist) ,#plist do local v=plist[i][k] if ...
- 【Lua】面向对象编程(一)
类和对象: account.lua module(...,package.seeall) Account={balance=} Account.new=function(self,o) local ...
- 热更新语言--lua学习笔记
一.lua安装和编程环境搭建 lua语言可以在官网:http://luadist.org/下载安装包安装,编程IDE之前学习使用的是SciTE(https://www.cnblogs.com/movi ...
- python面向对象编程(上)
面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...
随机推荐
- jQuery.Deferred对象
一.前言 jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ su ...
- C#反射(二) 【转】
如果没有看<C#反射(一)>.建议先看<C#反射(一)>再看这一篇.上一篇文章发表,有人评论我所写的东西比较基础.其实我也知道我也只不过是在写最基础的语法而已,之所以写它是因为 ...
- Servlet处理Cookie
1.CGI:进程,servlet:线程 2.HttpServletResponse下的方法就没有get开头的,(PrintWriter)getWriter在ServletResponse下. 3.st ...
- OpenJDK与HashMap
OpenJDK的非堆JDK增强提议(JDK Enhancement-Proposal,JEP)试图标准化一项基础设施,它从Java6开始,只能在HotSpot和OpenJDK内部使用.这种设施能够像管 ...
- Spring MVC 解读——<mvc:annotation-driven/>(转)
转自:http://my.oschina.net/HeliosFly/blog/205343 Spring MVC 解读——<mvc:annotation-driven/> 一.Annot ...
- 【转】MFC获取程序目录路径方法
原文网址:http://yeahyuanqing.blog.163.com/blog/static/118025091201149480818/ MFC获得当前应用程序目录的GetCurrentDir ...
- 单位分配的IP地址和电脑主机绑定了,我想用设置一个无线路由器,让我的笔记本电脑和手机都能上网?
单位分配的IP地址和电脑主机绑定了,我想用设置一个无线路由器,让我的笔记本电脑和手机都能上网? 配一个无线路由器就可以实现,将电脑IP配置成自动获取,找条网线一头插路由LAN口(路由器上有标明 ...
- IP定位 C#
IP定位 已经不是什么新的技术,但是在做项目中却会常常用到.找网上找了许久,也做了许多的实验,觉得QQwry.dat,很很好用的,作者也提供了开发的源码和大家分享. 在这里感谢作者.我在项目中也用到了 ...
- 使用Jquery解析Json基础知识(转)
在WEB数据传输过程中,json是以文本,即字符串的轻量级形式传递的,而客户端一般用JS操作的是接收到的JSON对象,所以,JSON对象和JSON字符串之间的相互转换.JSON数据的解析是关键. 先明 ...
- UValive 5713 Qin Shi Huang's National Road System
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...