LUA面向对象编程技巧
详文请见 http://ffown.sinaapp.com/?p=11
1. LUA中的对象
我们知道,对象由属性和方法组成。LUA中最基本的结构是table,So 必须用table描述对象的属性。lua中的function可以用来表示方法。那么LUA中的类
可以通过table + function模拟出来。至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。
2. Metatable
Lua中的metatable 类似于C++中的虚函数,当索引table中的项不存在时,会进一步索引metetable(如果设置了的话)是否存在该项。这跟虚函数概念
不是很吻合么?
3. 示例class
user_t = {} user_t.__index = user_t
以上代码声明class user_t。为了方便,user_t声明为全局的table。__index 是跟设置metatable有关,详细信息参见lua manual http://www.lua.org/manual/5.1/
实际上__index 应该赋值为function,这里是一个语法糖,等价于
user_t.__index = function(key) return user_t[key] end
定义构造函数:
function user_t:new(uid_)local obj = { ["uid"] = uid_, }setmetatable(obj, self)return objend
function user_t:dump()
print("self:", self.uid)
end
定义一个user_t对象代码如下:
local user = user_t:new(1122334)
user:dump()
new 函数返回一个table, 当索引dump时,obj中没有dump函数,尝试去metatable中索引,获得dump函数。
注意:
function user_t.dump(self) :方式定义函数只是个语法糖而已,其等价于
function user_t.dump(self)print("self:", self.uid)end
通常我都会对应定义一个析构函数(不好意思C++流)
function user_t:delete() self.uid = nilend
4. 实现继承
原理就是利用metatable,__index 设置这样的function,当前类不存在某项时,尝试去基类中查出
person_t = {} person_t.__index = person_t function person_t:new()local obj = { ["type"] = "person", } setmetable(person_t, self)return objend function person_t:type()print("type:", self["type"])end function user_t:new(uid_)local obj = { ["uid"] = uid_, }local mt = { ["__index"] = function(key_)local ret = user_t[key_] or person_t[key_]return retend }setmetatable(obj, mt)return objendlocal user = user_t:new(1122334) user:type()
5. 注意
1. 尽量不要使用多重继承
2. 不要尝试使用重载
更多精彩文章 http://h2cloud.org
转载于:https://www.cnblogs.com/zhiranok/archive/2012/02/07/lua_object_skill.html
LUA面向对象编程技巧相关推荐
- c++ 结构体初始化_单片机C语言 - 基于结构体的面向对象编程技巧
单片机C语言 - 基于结构体的面向对象编程技巧 一.面向对象 面向对象是软件开发方法,是相对于面向过程来讲的.通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式 ...
- lua的面向对象编程,封装,继承,多态的实现
简介 1. lua面向对象编程是基于元表metatable,元方法__index来实现的,具体元表和元方法的介绍 请见Lua的元表metatable及元方法 2. 语法糖 语法糖是由英国计算机科学家彼 ...
- lua 获取时分秒_果壳lua教程(第五集) :面向对象编程-制作一个钟表
>你以为还会是开头一段代码吗?然而并不是~ emmm~小茗童鞋,咱们今天来讲讲如何通过面向对象的方式来制作一块手表! 辣么,构成手表这一对象需要的哪些要素呢? 小茗同学:手表这东东,当然要由时. ...
- 面向对象编程已死,OOP 永存!
[CSDN编者按]ECS(ECS,Entity–component–system,实体组件系统,是一种主要用于游戏开发的架构模式),是在游戏开发社区广为流传的伪模式,它基本上是关系模型的翻版,其中&q ...
- 我所偏爱的 C 语言面向对象编程范式
我所偏爱的 C 语言面向对象编程范式 面向对象编程不是银弹.大部分场合,我对面向对象的使用非常谨慎,能不用则不用.相关的讨论就不展开了. 但是,某些场合下,采用面向对象的确是比较好的方案.比如 UI ...
- 如何通俗的理解面向对象编程
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:磐创AI 面向对象编程或OOP对于初学者来说可能是一个很 ...
- Python设计模式面向对象编程
前言 本篇文章是基于极客时间王争的<设计模式之美>做的总结和自己的理解. 说到面向对象编程,作为一个合格的Pythoner,可以说信手拈来.毕竟在Python里"万物都是对象 ...
- Delphi面向对象编程的20条规则
前言 大多数Delphi程序员都像使用Visual Basic 那样使用他们手头上开发工具,而丝毫没有意识到Delphi的强大功能,更谈不上使用这些功能了.(写到这里,编辑惶恐的举起了手,怎么可能呢? ...
- Kotlin极简教程:第7章 面向对象编程
原文链接:https://github.com/EasyKotlin 在前面的章节中,我们学习了Kotlin的语言基础知识.类型系统.集合类以及泛型相关的知识.在本章节以及下一章中,我们将一起来学习K ...
最新文章
- match_parent和fill_parent的区别
- 【2.CentOS6.8安装JDK】
- 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
- mysql 注释写法有哪些_mysql的注释有几种写法?
- 18000 Two String 暴力。——— 读题
- Smali语法汇总(一)
- 【渝粤教育】国家开放大学2018年春季 0706-21T行政管理学导论 参考试题
- linux打印系统cups原理分析
- ms17-010 php版本,Windows系统SMB漏洞ms17-010补丁下载!
- 【Proteus仿真】CD4026秒脉冲0-9循环计数
- [奇异吸引子]相关知识点
- 论文学习笔记 PrivateDrop: Practical Privacy-Preserving Authentication for Apple AirDrop
- java.io.NotSerializableException错误解决方法
- linux下载finger程序,Linux的finger命令
- CAD版本转换,手机该如何转换操作呢?
- 理解CSS clear:both/left/right的含义以及应用
- 程序员晒端午福利,网友:看了你的福利我想摔手机
- 小米2019秋招面试算法题 最少立方数之和 dp与dfs解法
- Acrel-2000型电力监控系统可实现配电所配电回路用电的实时监控和管理
- 龟虽寿 [魏晋] 曹操
热门文章
- 今日腊八节,祝福送上!
- $.ajax()参数详解及标准写法
- Java IO 节点流与处理流类型
- 用maven profile实现环境配置切换
- JAVA_SE基础——24.面向对象的内存分析
- CentOS 设置服务开机启动的方法
- [转]Android中pendingIntent的深入理解
- flash builder 4.7 debug via usb device iPhone 4s - device not found
- 你是一个优秀的IT PRO吗?(下篇)
- Redhat Linux编译安装LAMP环境