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 条评论
登录 后参与评论

相关文章

来自专栏Small Code

Python中strptime的简单使用

strptime是python datetime库中的函数,用于将一个日期字符串转成datetime日期格式便于后期处理,使用格式为datetime.strpt...

1828
来自专栏来自地球男人的部落格

关于Java中Stack类的使用

标签(空格分隔): java - 为什么不用Stack类 《Java编程思想》第四版一书中明确不建议我们使用java.util.Stack类,一直保留只是为了兼...

1949
来自专栏大前端_Web

javascript事件监听中传递匿名函数(嵌套定义的命名函数)与命名函数的区别

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

884
来自专栏黑白安全

PHP中echo,print,print_r,var_dump有什么区别

1.echo输出字符串或者数字,接受参数列表,不是函数,没有返回值。如果只是输出,echo更快

623
来自专栏蓝天

理解snprintf()函数

在编程中,需要关注snprintf()的两个问题:一是它的返回值,二是它的第二个参数。

462
来自专栏一“技”之长

Swift专题讲解二十一——协议 原

        协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用proto...

632
来自专栏知识分享

关于函数指针--简介

函数指针说白了,,,,函数的地址 现在看一个简单的--先定义一个函数指针 void (*f1)();就是这样定义--指向的是一个void类型的 假设定义了另一个...

2848
来自专栏Python小屋

Python版选择排序算法

关于Python版冒泡排序算法请参考:Python版冒泡法排序算法。 def selectSort(lst, reverse=False): leng...

2595
来自专栏我的博客

加强版正则表达式

以前觉得正则表达很难,今天又加强了一下正则表达的学习收获挺大的 在书写正则表达式的过程中我们遇到数字就用 最近在学习原生js,所有例子都在js下测试 常见案例一...

3779
来自专栏海天一树

小朋友学Python(7):输入与输出

一、print与input print "a =", a = input() print "b =" b = input() print "c =", c = ...

26610

扫码关注云+社区