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
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 = 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. 不要尝试使用重载

 更多精彩文章 http://h2cloud.org

 

转载于:https://www.cnblogs.com/zhiranok/archive/2012/02/07/lua_object_skill.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 排序 Array.SortT 实现分析

System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法&#xff0c;比如冒泡排序,插入排序,堆排序等&#xff0c;不过你知道这个方法背后使用了什么排序算法吗?先说结果, 实际上 Array.Sort 不止使用了一种排序算法, 为了保证不同的数据量的排…

Android 中文api (81)——InputMethod [输入法]

前言 本章内容是android.view.inputmethod.InputMethod&#xff0c;为输入法相关章节&#xff0c;版本为Android 2.3 r1&#xff0c;翻译来自"六必治"&#xff0c;欢迎大家访问他的博客&#xff1a;http://www.cnblogs.com/zcmky/&#xff0c;再次感谢"六必治&q…

联想电脑如何添加无线网络连接服务器,安装英特尔MYWIFI的操作步骤

适用范围:(1)操作系统&#xff1a;仅支持VISTA /WINDOWS 7&#xff0c;不支持WINDOWS XP/2003/2000&#xff1b;(2)硬件&#xff1a;INTEL MY WIFI支持INTEL 5100以及以上无线网卡&#xff0c;非INTEL无线网卡不支持。知识点分析:英特尔的MY WIFI技术是一项针对笔记本电脑无线网…

假如把女生比作一种水果

1 和睡相不好的人一起睡觉是什么体验&#xff1f;2 箱子里的是我方输出&#xff0c;外面的是对方打野3 女儿问爸爸小时候都玩什么&#xff0c;于是爸爸给她做了这个。。4 推上一网友随手拍到的照片&#xff0c;就好像是三张图片拼起来的一样。5 一位台湾艺用解剖学老师的硬核授…

张萍萍 计科高职13-1 201303014010

通过这次的实践&#xff0c;我第一次感觉学好一门英语是多么的重要&#xff0c;这次历尽千辛万险才把作业完成&#xff0c;通过这次实践我发现我还有许多的地方进行改进&#xff0c;不过通过这次试验我也学到了不少的东西&#xff0c;我学会了如何使用gethub来管理代码和如何管…

python tkinter进度条_在python3.7中更新tkinter进度条

抱歉&#xff0c;花了一段时间&#xff0c;但我能搞定。在 我不知道你遇到了什么与Python3.x不兼容的地方&#xff0c;但我找到了我跟踪的这个更新的视频。在 除了“停止”命令之外&#xff0c;它几乎完美地工作了&#xff0c;我无法开始工作。在from tkinter import * from tk…

ai怎么调界面大小_科研论文作图系列-从PPT到AI (一)

这是“投必得学术”推送的第44篇文章&#xff0c;专注科研技能和资讯分享&#xff01;关注“投必得学术”&#xff0c;可以看到我们所有干货和资讯&#xff01;导语&#xff1a;之前的推送中&#xff0c;小编给大家介绍过几款科研作图软件&#xff0c;包括统计分析软件Origin和…

HDU3363_贪心

解题大意&#xff1a; 给你一个串&#xff0c;串中有H跟T两种字符&#xff0c;然后切任意刀&#xff0c;使得能把H跟T各自分为原来的一半。 解题思路&#xff1a; 把串想象成一个环&#xff0c;只要满足H跟T都为偶数个&#xff0c;那么就可以做一条过圆心的直线把H跟T平分掉&am…

讲师征集| .NET Conf China 2021正式启动!

去年年初疫情突袭武汉&#xff0c;打得我们措手不及在众多 .NET 开发者们的殷切期盼声中一场轰动极客圈的技术狂欢趴毅然在苏州盛大开启、圆满落幕&#xff01;我们坚信&#xff0c;你还记忆犹新……▽因为&#xff0c;TA 是 .NET 5.0 发布的”里程碑“线上线下轮番轰炸的技术干…

【Android游戏开发十一】手把手让你爱上Android sdk自带“9妹”

本站文章均为 李华明Himi 原创,转载务必在明显处注明&#xff1a; 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/321.html 前几天群成员讨论过关于9patch的工具【我比较喜欢喊它9妹子&#xff0c;西西(*^_^*)】、然后研究了一下&#xff0c;比较…

为什么PostgreSQL比MongoDB还快之完结篇(深挖单点索引查询)

之前两篇测试中发现&#xff1a;单点索引查询中PostgreSQL的速度是MongoDB(WiredTiger引擎)的4倍。http://blog.chinaunix.net/xmlrpc.php?rblog/article&uid20726500&id4960138http://blog.chinaunix.net/xmlrpc.php?rblog/article&uid20726500&id4981629虽…

ajax和spa的区别,在XX团上消费过一次不正规的Spa,现在过来两个月公安局打电话叫我过去...

咨询我帮助人数&#xff1a;36021721.公安局打电话来的原因比较多&#xff0c;具体需要根据电话的内容进行分析。而且公安局的范围比较大&#xff0c;涉及到的部门比较多&#xff0c;每个部门负责处理各自的工作问题&#xff0c;有民事的&#xff0c;也有刑事的。有派出所的&am…

centos7 iptables 端口转发 保存_iptables 防火墙

目录&#xff1a;yum 在线安装yum卸载安装包rpm 卸载yum安装rpm离线安装利用 Downloadonly 插件下载 RPM 软件包及其所有依赖包使用 Yumdownloader 工具来下载 RPM 软件包及其所有依赖包yum 在线安装CentOS7默认的防火墙不是iptables,而是firewalle.yum卸载安装包yum remove to…

日本惊现神操作!偷偷研究飞刀方程致使厕所爆炸......

欢快如厕为何大声惨叫前几天&#xff0c;竟然有模友私信超模君&#xff0c;说这是不是真的。网友私信截图WTF&#xff01;数学史上就有一道“奇葩的”难题&#xff0c;是历代数学家们在厕所里解决的。厕所冥想1917年&#xff0c;为了给日本武士增添生活趣味&#xff0c;数学家挂…

(转)学习密度与专注力

转自&#xff1a;http://mindhacks.cn/2007/05/24/learn-to-focus/作者&#xff1a;刘未鹏上次学校里面有一个免费的李阳英语讲座&#xff0c;好奇于是就去听了一下。对一句话印象比较深刻&#xff0c;大意是说许多人学了快10年的英语&#xff0c;其开口的时间还不如在集训的七…

抓取手机https_python爬虫入门02:教你通过 Fiddler 进行手机抓包

哟~哟~哟~hi起来everybody今天要说说怎么在我们的手机抓包通过python爬虫入门01&#xff1a;教你在 Chrome 浏览器轻松抓包我们知道了 HTTP 的请求方式以及在 Chrome 中摸清了一些套路但是除了对数据进行解析之外有时候我们想对请求的数据或者响应的数据进行篡改怎么做呢&#…

BeetleX进程服务管理组件应用

有些时候需要在程序中启动和管理其他应用进程&#xff0c;当碰到这样的需求的时候可以通过Process对象来完成&#xff1b;为了让使用和管理更方便在这基础上封装 了BeetleX.ServicesProcess组件&#xff0c;通过组件的管理中心让进程操作更方便&#xff0c;同时还集成了Web套件…

server 2008 服务器不能访问 java项目,Java 8上的SQL Server JDBC错误:驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接...

我在一个Linux实例上的Java 8 JVM中启用了SSL记录,从而再现了这个问题.使用-Djavax.net.debug ssl&#xff1a;handshake&#xff1a;verbose打开SSL日志记录.这显示了一些有用的信息.我们在生产中使用并已证明可以为我们工作的解决方法是在JVM上设置此参数&#xff1a;-Djdk.…

自动上传下载

#!/bin/bashftp -n<<!open 192.168.1.171user guest 1234561. -n 不受.netrc文件的影响。&#xff08;ftp默认为读取.netrc文件中的设定&#xff09;2. << 是使用即时文件重定向输入。3. !是即时文件的标志它必须成对出现&#xff0c;以标识即时文件的开始和结尾#!…

升级总代分享思路_桃生企业至尊七郎瓷砖新展厅全新升级惊艳亮相

桃生企业至尊七郎瓷砖新展厅惊艳亮相&#xff0c;将艺术和时尚完美融合&#xff0c;即将成为晋江天工建材城的新地标&#xff01;2020年桃生企业逆流升级进行中&#xff0c;全新展厅即将揭幕&#xff01;全新空间 对话年轻轻奢于行&#xff0c;优雅于里&#xff0c;全新一楼的…