详文请见 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面向对象编程技巧相关推荐

  1. c++ 结构体初始化_单片机C语言 - 基于结构体的面向对象编程技巧

    单片机C语言 - 基于结构体的面向对象编程技巧 一.面向对象 面向对象是软件开发方法,是相对于面向过程来讲的.通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式 ...

  2. lua的面向对象编程,封装,继承,多态的实现

    简介 1. lua面向对象编程是基于元表metatable,元方法__index来实现的,具体元表和元方法的介绍 请见Lua的元表metatable及元方法 2. 语法糖 语法糖是由英国计算机科学家彼 ...

  3. lua 获取时分秒_果壳lua教程(第五集) :面向对象编程-制作一个钟表

    >你以为还会是开头一段代码吗?然而并不是~ emmm~小茗童鞋,咱们今天来讲讲如何通过面向对象的方式来制作一块手表! 辣么,构成手表这一对象需要的哪些要素呢? 小茗同学:手表这东东,当然要由时. ...

  4. 面向对象编程已死,OOP 永存!

    [CSDN编者按]ECS(ECS,Entity–component–system,实体组件系统,是一种主要用于游戏开发的架构模式),是在游戏开发社区广为流传的伪模式,它基本上是关系模型的翻版,其中&q ...

  5. 我所偏爱的 C 语言面向对象编程范式

    我所偏爱的 C 语言面向对象编程范式 面向对象编程不是银弹.大部分场合,我对面向对象的使用非常谨慎,能不用则不用.相关的讨论就不展开了. 但是,某些场合下,采用面向对象的确是比较好的方案.比如 UI ...

  6. 如何通俗的理解面向对象编程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:磐创AI 面向对象编程或OOP对于初学者来说可能是一个很 ...

  7. Python设计模式面向对象编程

    前言 本篇文章是基于极客时间王争的<设计模式之美>做的总结和自己的理解.   说到面向对象编程,作为一个合格的Pythoner,可以说信手拈来.毕竟在Python里"万物都是对象 ...

  8. Delphi面向对象编程的20条规则

    前言 大多数Delphi程序员都像使用Visual Basic 那样使用他们手头上开发工具,而丝毫没有意识到Delphi的强大功能,更谈不上使用这些功能了.(写到这里,编辑惶恐的举起了手,怎么可能呢? ...

  9. Kotlin极简教程:第7章 面向对象编程

    原文链接:https://github.com/EasyKotlin 在前面的章节中,我们学习了Kotlin的语言基础知识.类型系统.集合类以及泛型相关的知识.在本章节以及下一章中,我们将一起来学习K ...

最新文章

  1. match_parent和fill_parent的区别
  2. 【2.CentOS6.8安装JDK】
  3. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
  4. mysql 注释写法有哪些_mysql的注释有几种写法?
  5. 18000 Two String 暴力。——— 读题
  6. Smali语法汇总(一)
  7. 【渝粤教育】国家开放大学2018年春季 0706-21T行政管理学导论 参考试题
  8. linux打印系统cups原理分析
  9. ms17-010 php版本,Windows系统SMB漏洞ms17-010补丁下载!
  10. 【Proteus仿真】CD4026秒脉冲0-9循环计数
  11. [奇异吸引子]相关知识点
  12. 论文学习笔记 PrivateDrop: Practical Privacy-Preserving Authentication for Apple AirDrop
  13. java.io.NotSerializableException错误解决方法
  14. linux下载finger程序,Linux的finger命令
  15. CAD版本转换,手机该如何转换操作呢?
  16. 理解CSS clear:both/left/right的含义以及应用
  17. 程序员晒端午福利,网友:看了你的福利我想摔手机
  18. 小米2019秋招面试算法题 最少立方数之和 dp与dfs解法
  19. Acrel-2000型电力监控系统可实现配电所配电回路用电的实时监控和管理
  20. 龟虽寿 [魏晋] 曹操

热门文章

  1. 今日腊八节,祝福送上!
  2. $.ajax()参数详解及标准写法
  3. Java IO 节点流与处理流类型
  4. 用maven profile实现环境配置切换
  5. JAVA_SE基础——24.面向对象的内存分析
  6. CentOS 设置服务开机启动的方法
  7. [转]Android中pendingIntent的深入理解
  8. flash builder 4.7 debug via usb device iPhone 4s - device not found
  9. 你是一个优秀的IT PRO吗?(下篇)
  10. Redhat Linux编译安装LAMP环境