其实脚本语言已经封装的很好了,用到的一切都可以说是对象了,单独学习一下lua的OOP只是为了将来看代码方便一点。

首先需要注意的:

1.lua不存在类的概念,没有明确的语法用来声明类

2.lua的OOP实际上是通过table来实现的,这也有道理,因为对象本质就是数据和操作封装在一起

一.对象

上面提过,对象本质就是数据和操作的集合,通过表的键值对很容易定义一个对象。下面通过《Programming in Lua》中的例子来讲解。先吐槽一下这本书,由lua的作者Roberto Ierusalimschy编写,所以每个知识点都很到位。但是也正因为他太熟悉这门语言,所以知识递进做的不是很好,比如在类中用到了元表metatable的知识,但是你去学习metatable的时候又出现了类的概念。最好的做法是尽量避免知识重叠,实际上metatable不太需要那么复杂的例子,所以这本书不太适合新手看。

1 Account = {balance = 0}
2 function Account.withdraw (v)
3 Account.balance = Account.balance - v
4 end

上面的代码定义了一个Accoount的对象,有一个属性balance和一个方法withdraw,这样看起来已经实现了对象——数据和操作的封装,但是如果改变了对象的名字,那么就会出现下面的问题

1 a = Account; Account = nil
2 a.withdraw(100.00)  -- ERROR!

这是因为我们在定义withdraw函数的时候使用了Account这个变量的名字,而不是对象本身,这显然违反了对象的原则,对象的数据和操作只和值有关,而和变量名无关,因此需要在定义方法的时候指明操作的对象,这需要在方法的第一个参数加一个self,用来传递对象本身,如下

1 function Account.withdraw (self, v)
2 self.balance = self.balance - v
3 end

这样在调用的时候将对象传递进去,就知道改变的是哪个对象了

1 a1 = Account; Account = nil
2 ...
3 a1.withdraw(a1, 100.00) -- OK

当然,这个其实没有什么神奇之处,只是额外传递了一个参数,但是lua像其他的OOP语言一样,提供了将self隐藏的方法,使用冒号声明函数,这样我们在定义和使用函数的时候就不必显式的加入self参数,方法如下

1 function Account:withdraw (v)
2 self.balance = self.balance - v
3 end

调用的时候也是对象:方法,这样就省去了额外写一个self的麻烦,但本质和上面的做法是一样的,只不过语言替你处理了而已

a:withdraw(100.00)

二.类和继承

上面说过lua之中并没有真正的类声明,所以一切都是用table机制实现的,但是仔细阅读《Programming in Lua》这个本书,就会发现这里面的类其实并不是严格意义上的类,而是继承类(派生类),比如下面这段代码

1 Account = {balance = 0}
2 function Account:new (o)
3 o = o or {}
4 setmetatable(o, self)
5 self.__index = self
6 return o
7 end

实际上lua的继承是使用了元表的__index元方法,不了解的可以看这篇Lua学习笔记-metatable元表

那么当你使用Account:new出来的对象,实际上就是将Account设置成了元表的一张普通表,所有它找不到的属性和方法,都会去元表中查找,间接实现了继承。为什么我说是实现了继承而不是类呢,因为像C++和Java这种语言的类,在对象实例化之后是不可能私自添加属性或方法的,但是lua中对象实际就是一个table,你想加什么就加什么,没有这些限制,所以更像继承。

看到这里,你会发现lua的类和对象概念十分模糊,实际上大多数的脚本语言并不会经常使用这些概念,因为你使用的每一个值都是一个对象,你以为你声明了类,实际上他也是一个对象,只不过用起来好像类一样。那么为什么还要学习呢,其实重要的是思想,为什么使用类和对象,肯定离不开封装、继承、多态这三大特性,而大多数脚本语言本身就很好的实现了这些,重点关心的应该是怎么用好。

转载于:https://www.cnblogs.com/InitialD/p/7449082.html

Lua学习笔记-OOP面向对象相关推荐

  1. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  2. Lua学习笔记6:C++和Lua的相互调用

    曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...

  3. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  4. lua 学习笔记---游戏开发第一步

    lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...

  5. Lua学习笔记(2)

    前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...

  6. 学习笔记----MATLAB面向对象编程入门02--类的方法、构造函数

    本系列内容为<MATLAB面向对象编程–从入门到设计模式>学习笔记,特此说明. 定义类的方法 类的方法(Method)一般用来查询(Query)对象的状态,或者向对象发出一个命令(Comm ...

  7. 【廖雪峰Python学习笔记】面向对象编程OOP

    面向对象编程 OOP:Object Oriented Programming 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法] 三大特点:数据封装.继承和多态 OPP中的计 ...

  8. Python学习笔记:面向对象编程(2)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. Python学习笔记:面向对象编程(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. 简明Python教程学习笔记_6_面向对象编程

    面向对象编程:https://www.liaoxuefeng.com/wiki/897692888725344/923030496738368 面向对象高级编程:https://www.liaoxue ...

最新文章

  1. Java常见面试题,2021年及答案汇总
  2. Windows~KinectV2开发
  3. MySQL-Front,MySQL的企业管理器
  4. 「LibreOJ β Round #4」子集
  5. 高端第一后,卡萨帝又将靠场景化引领冰箱行业
  6. Numpy练习题-锻炼手写机器学习模型的能力
  7. leetcode387. 字符串中的第一个唯一字符
  8. 2021-06-18激活函数的意义
  9. 模板设计模式_C常用设计模式——模板方法模式
  10. php opcache 安装,php opcache安装和配置
  11. 《架构之美》阅读笔记06
  12. 一篇通俗易懂的文章初探NIO
  13. jxt - 强结构文档数据表示协议
  14. Leetcode刷题-459:重复的子字符串
  15. 2021最全财富密码,95个即将发币项目概览
  16. django学习笔记(五)------path
  17. 牛顿迭代法求高次方程的根
  18. ping6 之 unknown host 解决方法
  19. 全国软件专业人才开发与设计赛题之中等题“统计省份人员信息”
  20. 为什么日本的网页设计风格还停留在90年代?

热门文章

  1. 优派 ELITE XG320Q、XG320U / UG 评测
  2. 金山WPS服务端开发工程师(第一次)(2018年秋招 2018-9-4)
  3. 工业级路由器和家用路由器的区别_工业级路由器和家用路由器有何区别?
  4. Android主界面退出再次进入略过欢迎面
  5. 盘点免费好用的5款思维导图工具
  6. Matplotlib折线图(绘图实例+代码详解)
  7. 实验五 八段数码管显示(红绿灯)
  8. 壁纸控福音:私藏的100PC张壁纸一次打包分享
  9. openwrt修改默认网关地址_修改宇视摄像机IP地址的方法
  10. idea删除文件时出现选项 “Safe delete ( with usage search)“ 和 “Search in comments and strings“