专栏首页H2CloudLUA面向对象编程技巧

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 obj

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 = nil

end

4. 实现继承

原理就是利用metatable,__index 设置这样的function,当前类不存在某项时,尝试去基类中查出

person_t = {}

person_t.__index = person_t



function person_t:new()

local obj = 

{

["type"] = "person",

}

setmetable(person_t, self)

return obj

end



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 ret

end

}

setmetatable(obj, mt)

return obj

end

local user = user_t:new(1122334)

user:type()

5. 注意

1. 尽量不要使用多重继承

2. 不要尝试使用重载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用LUA协程实现FUTURE模式

    1. Future模式: 参见 http://www.cnblogs.com/zhiranok/archive/2011/03/26/Future_Patter...

    知然
  • 支持插件的消息中间件【msg broker with plugin】

    支持插件的消息中间件 msg broker with plugin Msg Broker概念: msg broker是实现application 之间互通讯的组...

    知然
  • C++中消息自动派发之四 使用IDL构建Chat Server

      前一篇blog 讲了如何实现IDL 解析器,本篇通过IDL解析器构建一个聊天服务器程序。本程序用来测试IDL解析器的功能,网络层使用前边blog中介绍的ff...

    知然
  • 干货 | 统计学概论和医疗临床大数据分析(附PPT下载)

    本文内容选自加拿大约克大学数学统计系终身教授王晓刚于近期在清华大数据“技术·前沿”系列讲座所做的题为《统计学概论和医疗临床大数据分析》的演讲。

    数据派THU
  • python redis链接建立实现分析

      今天在写zabbix storm job监控脚本的时候用到了python的redis模块,之前也有用过,但是没有过多的了解,今天看了下相关的api和源码,看...

    py3study
  • 游戏开发7天快速入门(3)-GUI图形用户界面及NGUI详解

    其实想一下OnGUI方法是在每一帧重绘时进行调用。所以在每一帧的时候就会重新绘制文本框的内容。所以导致哪怕我们进行删除重新输入,则导致又被重新绘制了。所以这个时...

    做全栈攻城狮
  • python学习笔记6.7-简化数据结构的初始化过程

    我们每编写一个类的时候都需要编写一个初始化函数,那么如果编写的类当做数据结构来用,它们的初始化结构就是一样的,例如: class Stock: def ...

    锦小年
  • 增长产品中,量化数据分析的几个方法

    | 导语 一个产品模块或活动,多少人参与?很好回答。如果没有它,大盘DAU会影响多少?就不太好回答。这个就是“增量贡献”,增量贡献无法直接统计,但又是管理者最...

    腾讯大讲堂
  • 第二篇|腾讯开源项目盘点:ncnn、xLua、libco等

    开源展示了人类共同协作,成果分享的魅力,每一次技术发展都是站在巨人的肩膀上,技术诸多创新和发展往往就是基于开源发展起来的,没有任何一家网络公司可以不使用开源技术...

    腾讯技术工程官方号
  • 行业盘点 | 农业科技行业10大关键词

    前言 农业科技是推动农业现代化发展的动力,进入2018年我国农业科技也将会新的发展。回顾2017年,我国农业科技发展也有诸多的亮点。2017年我国最值得关注的农...

    灯塔大数据

扫码关注云+社区

领取腾讯云代金券