lua语言中没有真正意义的面向对象,而是通过函数模拟面向对象。我们来看是怎么一步步演化的。

1. 基本的函数

People = {}function People.sayHi()print("Hi, nice to meet you.")
endPeople.sayHi();People.sayHi = function()print("Hi, nice to meet you from func")endPeople.sayHi();-- 上面的两种方法效果是一样的
--result:
--Hi, nice to meet you.
--Hi, nice to meet you from func

2. 首先说说怎样遍历table的,(在lua中对象实际就是table,对象.字段名 == table[字段名],所以有必要先讲讲怎么遍历table),用到pairs函数

local arr = {"one", "two", ["one"] = "xxx", ["two"] = "yyy"}local intValue = 3for key, val in pairs(arr) doprint("value of "..key.." is "..val)
end
--输出table所有的属性,包括“数组”属性
--value of 1 is one
--value of 2 is two
--value of one is xxx
--value of two is yyyfor key, val in ipairs(arr) do --友情介绍另外一个函数 ipairs print("value of "..key.." is "..val)
end
--只输出table的“数组”属性
--value of 1 is one
--value of 2 is twofor key, val in pairs(intValue) doprint("value of "..key.." is "..val)
end-- 不是table  在调用pairs函数的时候跑出异常
-- bad argument #1 to 'pairs' (table expected, got number)

3. 原来的样子其实没new什么事,长得跟new差好远,不信你看

-- 工具函数
function clone(origin)local dest = {}for key, value in pairs(origin) dodest[key] = valueend  return dest;
end--定义类
People = {}People.sayHi = function()print("Hi, nice to meet you from func")end--用类生产对象,对象有了类的方法
p = clone(People) --样子确实差的好多,一点都不优雅   new Peopel()这样写多优雅呀, lua是不是干不了这活儿
p.sayHi();--result: 结果倒是对了,但是样子太不优雅,我不接受这么难看的写法。。。
--Hi, nice to meet you from func
--Hi, nice to meet you from func

4. 换个模样,我们把clone函数偷偷的封装到一个名字叫new的函数中,修改最后两行代码(从p = clone(People)开始之后的代码替换为下面的样子)(这一步是关键)

function People.new()self = clone(People)   return selfend--用类生产对象,对象有了类的方法
--p = clone(People)
--这句话被封装到new函数中p = People.new()
p.sayHi();

哈哈,是不是可以new对象了。 哎,真是穿个马甲还真是认不出来了。。。(除非看了这篇文章,哈哈,胡扯的,大牛们早就有文章了)

5. 我们想让对象支持 带参数的new(相当于java中带参数的构造函数 如 new String("parameter")),对People整个‘类’重写,

--定义类
People = {}People.sayHi = function(self)print("Hi, nice to meet you from func, My name is "..self._name) -- 输出_name字段    --这一行会报错,attempt to index local 'self' (a nil value)--因为下面调用方式是p.sayHi()endfunction People.new(name)self = clone(People)   self._name = name --用构造参数初始化_name字段return selfend--用类生产对象,对象有了类的方法
--p = clone(People)
--这句话被封装到new函数中p = People.new("stephen")
p.sayHi();--result:
--attempt to index local 'self' (a nil value)

靠,搞了个参数就报错了,空指针,,没办法我们只能将指针传进去

p.sayHi() - - -->p.sayHi(p)

- -结果 改正确了

- -Hi, nice to meet you from func, My name is stephen

哈哈搞定输出来了。

但是

p.sayHi(p)
这个写法也太丑了吧,人家java c++ 程序员会鄙视这么难看的写法的,好,lua帮我们美化一下

p.sayHi(p) - - -> p:sayHi()

- -结果正确

- -Hi, nice to meet you from func, My name is stephen

用冒号(:)代替点号(.),lua会自动帮我们变形,将点号前面的对象传递给参数。

例如 lilei:setGirlFriend("hanmeimei") - - ->lilei.setGirlFriend(lilei, "hanmeimei")

弯子转过去了,,在lua中用函数实现了面向对象。

6.等等,继承又怎么实现呢??

哈哈,下面的代码演示一下

-- 工具函数
function clone(origin)local dest = {}for key, value in pairs(origin) dodest[key] = valueend  return dest;
end--定义类
People = {}People.sayHi = function(self) --父类上的方法print("Hi, nice to meet you from func, My name is "..self._name) -- 输出_name字段    --这一行会报错,attempt to index local 'self' (a nil value)--因为下面调用方式是p.sayHi()endPeople.eat = function()print("Different people eat different thing")
endPeople.new = function(name)self = clone(People)   self._name = name --用构造参数初始化_name字段return selfendfunction copy(dest, tab)for key, val in pairs(tab) dodest[key] = valendend-- 定义子类
Chinese = {}Chinese.new = function(name, hukou)self = People.new(name);    --new 父类对象实现继承self._hukou = hukoucopy(self, Chinese)  -- 子类上面的 特有的属性也附着到self上面return self
endChinese.eat = function() -- 覆盖父类方法print("Eat mantou")
endChinese.buyHouse = function()print("Can not afford at all")
endlisi = Chinese.new("lisi", "hebei")print(lisi._name.." is from "..lisi._hukou) -- 父类的成员和自己的成员lisi:sayHi() -- 继承父类方法
lisi:eat() -- 覆盖父类方法
lisi:buyHouse() -- 子类独有的方法--result
--lisi is from hebei
--Hi, nice to meet you from func, My name is lisi
--Eat mantou
--Can not afford at all

继承也搞定了,,收工

lua面向对象是怎么实现的相关推荐

  1. 雷林鹏分享:Lua 面向对象

    面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构. 以下几种编程语言都支持面向对象编程: C++ Java Objective-C Smal ...

  2. Lua 面向对象 创建类实例

    Lua 面向对象 创建类实例 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构 常用的面向对象编程语言:C++.Java.Object-C. ...

  3. lua面向对象封装及元表(metatable)性能测试

    Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...

  4. 函数闭包的方式实现lua面向对象

    前文http://blog.csdn.net/s_xing/article/details/19575059 说到了怎样实现lua的面向对象,但是有个小问题就是这种方式不能实现封装,,所有的属性都是共 ...

  5. lua面向对象setmetatable使用

    local obj = {} setmetatable( obj, { __index = mission_t } ) return obj mission_t为对应模块的文件名. 在LUA中的文件中 ...

  6. Lua 面向对象基础-类和对象(一)

    目录 1. lua中创建对象 2.lua中定义类的思路 3.元表的概念 4.类的定义和实例化 5. 重写类的方法 lua是一门面向过程的脚本语言,lua语言对于事物.结构通通描述为 table,而类和 ...

  7. LUA面向对象编程技巧

    详文请见 http://ffown.sinaapp.com/?p=11 1. LUA中的对象 我们知道,对象由属性和方法组成.LUA中最基本的结构是table,So 必须用table描述对象的属性.l ...

  8. xlua学习之路(三)Lua面向对象

    简单实例 [lua创建对象]假如我们有一个人,这个人名字将张三,年龄18,在lua中我们可以这样实现 person={name="张三",age=18} 那么现在我们又来了人,名字 ...

  9. Lua面向对象利用metamethod重载运算符

    2019独角兽企业重金招聘Python工程师标准>>> ##利用Point作为例子 local math = require("math") local Poin ...

最新文章

  1. LeetCode简单题之使每位学生都有座位的最少移动次数
  2. 阿尔伯塔大学博士毕业论文:基于图结构的自然语言处理
  3. WCF 设计和实现服务协定(01)
  4. MongoDB 安全 checklist 及最优配置模板
  5. mysql按升序创建索引_Mysql中的降序索引底层实现
  6. easyui学习笔记一:主要结构
  7. Get value from agent failed:ZBX_TCP_READ() timed out(亲测)
  8. Ubuntu 16.04下安装VMware Tools
  9. Hadoop快速入门——第一章、认识Hadoop与创建伪分布式模式
  10. win10搜索框没反应或者搜索太慢,看这篇就够了
  11. Biopython -- SeqIO
  12. Python 转义字符(含用法)
  13. vue中对token的有效期的理解
  14. 【智能制造】智能制造与智能工厂的主要特征
  15. 个人支付收款方案-PayJS
  16. 24.Odoo产品分析 (三) – 人力资源板块(5) – 出勤(1)
  17. 特斯拉与费拉里斯究竟是如何发明多相电机的呢?
  18. [ZZ]:44本计算机经典书籍
  19. 关于 SSL 及 CA 证书,你可能需要知道这些
  20. web测试和手机测试的区别

热门文章

  1. redis的数据持久化方案
  2. PHP:打造一个无限极评论模块
  3. C++实现的间接寻址
  4. window2003 httpdns
  5. 震惊!!!CSS垂直居中竟然有这么多方法~
  6. MongoDB数据库(二):增删查改
  7. 也来学学插件式开发续-利用MEF
  8. 使用浏览器地址栏调用CXF Webservice的写法
  9. Mysql 执行顺序
  10. mac读写ntfs工具