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学习----面向对象编程的更多相关文章

  1. Lua 之面向对象编程

    Lua 之面向对象编程 Lua并不是为面向对象而设计的一种语言,因此,仅从原生态语法上并不直接支持面向对象编程,但Lua的设计中仍然包含了很多面向对象的思想,理解它们也更有助于理解Lua自身的一些高级 ...

  2. 学习面向对象编程OOP 第二天

    好,今天继续学习这个面向对象编程.(根据博客园 小炒花生米写的博客学习而来) 一,封装性 a.把对象的全部属性和全部服务(方法)结合在一起,形成一个不可分割的独立单元 =>对象 b.信息隐蔽,尽 ...

  3. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  4. python 学习 面向对象编程

    面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...

  5. python学习——面向对象编程

    关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261

  6. 【Lua】面向对象编程(二)

      多重继承: module(...,package.seeall) local function search(k,plist) ,#plist do local v=plist[i][k] if ...

  7. 【Lua】面向对象编程(一)

    类和对象: account.lua   module(...,package.seeall) Account={balance=} Account.new=function(self,o) local ...

  8. 热更新语言--lua学习笔记

    一.lua安装和编程环境搭建 lua语言可以在官网:http://luadist.org/下载安装包安装,编程IDE之前学习使用的是SciTE(https://www.cnblogs.com/movi ...

  9. python面向对象编程(上)

    面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...

随机推荐

  1. 让chrome浏览器快的不要不要的

    Chrome 已经成了很多人的主力浏览器,你可能被它的简洁快速所吸引,但它日益丰富的「扩展」,你可能从来都没有接触过,而事实上,很多扩展可以挖掘出 Chrome 的潜能,让它变得前所未有的强大.有哪些 ...

  2. h.264 去块滤波

    块效应及其产生原因 我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact). 首先我们需要 ...

  3. CAD文件导入AD09

    1.首先将CAD图纸倒出为DXF格式的文件. 2.在altium designer 的pcb编辑中点菜单文件--导入,在弹出的对话框中,选择导入文件的类型,选择 DWG,DXF类型.然后确定,再弹出的 ...

  4. VLD(Visual LeakDetector)内存泄露库的使用

    VLD简介 由于C/C++语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自己来控制,这会给C/C++程序员带来一定的困难.当您的程序越来越复杂时,它的内存管理也会变得越来越困难.内存泄漏.内存 ...

  5. HDU 4430 Yukari's Birthday (二分+枚举)

    题意:给定一个n(18 ≤ n ≤ 10^12),一个等比数列k + k^2 + .......+ k^r = n 或者 = n-1,求出最小的k*r,如果最小的不唯一,则取r更小的 分析:两个未知数 ...

  6. Delphi中代替WebBrowser控件的第三方控件

    这几天,接触到在delphi中内嵌网页,用delphi7自带的TWebBrowser控件,显示的内容与本机IE8显示的不一样,但是跟装IE8之前的IE6显示一个效果.现在赶脚是下面两个原因中的一个: ...

  7. 【HDOJ】1043 Eight

    这道题目最开始做的时候wa+TLE.后面知道需要状态压缩,最近A掉.并且练习一下各种搜索算法. 1. 逆向BFS+康拓展开. #include <iostream> #include &l ...

  8. 通过jquery-ui中的sortable来实现拖拽排序

    1.引入文件 <script src="{sh::PUB}js/jquery-1.10.1.min.js"></script> <link rel=& ...

  9. 分布式文件系统FastDFS安装与配置(单机)

    安装包如下:fastdfs-nginx-module_v1.16.tar.gzFastDFS_v5.05.tar.gzlibfastcommon-master.zipnginx-1.8.0.tar.g ...

  10. 2015第43周一solr相关概念

    Solr是一种开放源码的.基于Lucene的搜索服务器.它易于安装和配置,而且附带了一个基于HTTP 的管理界面.   官网:http://lucene.apache.org/solr/ solr学习 ...