CNTXJ.NET | 通信界-中国通信门户 | 通信圈 | 通信家 | 下载吧 | 说吧 | 人物 | 前瞻 | 智慧(区块链 | AI
 国际新闻 | 国内新闻 | 运营动态 | 市场动态 | 信息安全 | 通信电源 | 网络融合 | 通信测试 | 通信终端 | 通信政策
 专网通信 | 交换技术 | 视频通信 | 接入技术 | 无线通信 | 通信线缆 | 互联网络 | 数据通信 | 通信视界 | 通信前沿
 智能电网 | 虚拟现实 | 人工智能 | 自动化 | 光通信 | IT | 6G | 烽火 | FTTH | IPTV | NGN | 知本院 | 通信会展
您现在的位置: 通信界 >> 接入系统 >> 技术正文
 
Lua面向对象编程的基本原理示例
[ 通信界 | 道哥 | www.cntxj.net | 2022/10/30 18:42:03 ]
 

目录

· 一些废话

· 测试代码

· 代码说明

· 基类(父类) A

· 派生类(子类) B

· 子类对象操作私有变量

· 继续往下继承

别人的经验,我们的阶梯!

一些废话

Lua语言是一个小而美的语言,使用者不多。

估计阅读这篇文章的人也不会多,姑且当做一篇笔记吧。

这篇文章主要描述:在Lua语言中,如何通过table结构来实现面向对象编程。

主要是看到某鸟教程上错误百出,估计示例代码自己都没有测试过;

关于Lua语言中的table以及metatable的基本知识,这里就不赘述了,官方手册中描述的很清楚。

测试代码 

image.png

image.png

执行结果如下:

image.png

代码说明 

基类(父类) A

首先来分析下4-25行的代码。

4-9行:定义父类A的成员变量和函数(按照C++中的习惯,可以叫做方法),可以看出Lua语言中的函数是“一等公民”,是可以赋值给一个变量的。

11-16行:相当于是构造函数,用来创建一个父类A的对象。

18-20行:给父类A增加一个函数,待会在分析子类B的时候再说。

22行:调用A:new()函数,创建一个类A的对象,赋值给变量objA。

在A:new()函数中,关键是第13行代码:此时self等于A,就相当于是A.__index = A,这是合法的。

因为函数的调用方式是A:new(),Lua的语法糖会把A作为第一个参数传递给new()函数的第一个隐藏参数self。

然后执行14行的setmetatable(t, self),相当于把表t的元表设置为A。

以上两行搞明白之后,23-24行的打印语句就简单了:

23行:因为表objA中没有成员a,但是objA被设置了元表A,而且该元表A带有__index属性,该属性的值是表A自己,于是就到A中查找是否有成员a,于是就打印出:

image.png

__index 属性的值,可以是一个表,可以是一个函数;

只不过这里特殊一点:__index 设置为 A 自己;

24行:查找函数的过程是一样的,找到元表A的__index属性的值,也就是表A自己中的funcA函数,然后调用,打印出:

image.png

派生类(子类) B

28-33行:定义了子类B,其实它也是一个对象。

在创建函数A:new(t)中,参数t的值是:

image.png

此时,self仍然是父类A,B的创建过程与objA的创建过程是一样的,只不过给参数t设置了子类B自己的成员变量和函数。

所以,B的元表被设置为A(14行代码的功劳),当然了A的__index仍然被设置为A自己。

关键是35行:objB = B:new(),得仔细唠唠。

子类B并没有自己的new函数,但是类B(也是一个 table) 的元表被设置为A,并且A.__index = A,所以最终就找到了A中的new函数,也就是11-16行代码。

进入这个函数中时,第一个隐藏参数self被设置为 B 了,因为函数调用形式是:B:new()。

所以:

13 行 self.__index = self  相当于设置 B.__index = B

14 行 etmetatable(t, self) 相当于把表 t 的元表设置为 B

new()函数返回之后,就把t赋值给objB。

下面再看一下36-39行的打印语句:

image.png

36行:objB中并没有成员a,但是objB的元表是B,而且B.__index = B,所以就到B中去查找a。

虽然B中也没有a,但是B的元表是A,而且A.__index = A,所以就在A中找到了成员a,打印出:

image.png

37行:objB中并没有成员b,但是objB的元表是B,而且B.__index = B,所以在B中找到了成员b,因此打印出:

image.png

37和38行的查找过程是类似的,只不过换成了函数而已。

子类对象操作自己的变量

41行:objB:myadd(10)。

查找myadd函数的过程与查找obj.a的过程是一样的,这里再唠叨一遍:

1. objB 中并没有函数 myadd,但是 objB 的元表是 B,而且 B.__index = B,所以就到 B 中去查找 myadd;

2. 虽然 B 中也没有 myadd,但是 B 的元表是 A,而且 A.__index = A,所以就在 A 中找到了函数 myadd;

于是就调用了函数:

image.png

而且self等于objB,因此函数体中就等于是:

image.png

加法表达式中的objB.a的读取过程,上面已经描述过了,最终定位到的是父类A中的a,即:1。

1 + 10 = 11,然后把11赋值给objB.a。

在赋值操作中,被赋值的objB.a就不再是父类A中的那个a了!

因为objB本质是一个table,给objB设置键值对的时候:

1. 如果键已经存在了,那么就直接设置该键的值;

2. 如果键不存在,那么 lua 会看它的元表中是否有 __newindex 字段(可以是一个table,也可以是一个函数);

2-1. 如果有   __newindex 字段,那么就是调用 __newindex (如果是一个函数),或者在 __newindex 中添加键值对(如果是一个table);

2-2. 如果没有 __newindex 字段,那么就直接在 objB 中存储该键值对;

根据上面这个规则,就会设置objB.a = 11。

明白以上这些之后,42和43行的打印语句就不复杂了。

42行:objA最终找到的a是父类A中的成员a,打印出:objA.a = 1。

43行:objB中自己已经有了成员a,所以打印出:objB.a = 11。

继续往下继承

有了上面的基础,再从子类B中派生出类C,C派生出类D... 都不是什么问题了,如下所示:

image.png

感兴趣的读者可以自己测试一下。

 

1作者:道哥 来源:通信界 编辑:顾北

 

声明:①凡本网注明“来源:通信界”的内容,版权均属于通信界,未经允许禁止转载、摘编,违者必究。经授权可转载,须保持转载文章、图像、音视频的完整性,并完整标注作者信息并注明“来源:通信界”。②凡本网注明“来源:XXX(非通信界)”的内容,均转载自其它媒体,转载目的在于传递更多行业信息,仅代表作者本人观点,与本网无关。本网对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。③如因内容涉及版权和其它问题,请自发布之日起30日内与本网联系,我们将在第一时间删除内容。 
热点动态
普通新闻 中信科智联亮相2023中国移动全球合作伙伴大会
普通新闻 全球首个基于Data Channel的新通话商用网络呼叫成功拨通
普通新闻 中国联通:以优质通信服务 助力“一带一路”共建繁华
普通新闻 杨杰:未来五年,智算规模复合增长率将超过50%
普通新闻 长沙电信大楼火灾调查报告发布:系未熄灭烟头引燃,20余人被问责
普通新闻 邬贺铨:生态短板掣肘5G潜能发挥,AI有望成“破局之剑”
普通新闻 工信部:加大对民营企业参与移动通信转售等业务和服务创新的支持力
普通新闻 摩尔线程亮相2023中国移动全球合作伙伴大会,全功能GPU加速云电脑体
普通新闻 看齐微软!谷歌表示将保护用户免受人工智能版权诉讼
普通新闻 联想王传东:AI能力已成为推动产业升级和生产力跃迁的利刃
普通新闻 APUS李涛:中国的AI应用 只能生长在中国的大模型之上
普通新闻 外媒:在电池竞赛中,中国如何将世界远远甩在后面
普通新闻 三星电子预计其盈利能力将再次下降
普通新闻 报告称华为5G专利全球第1 苹果排名第12
普通新闻 党中央、国务院批准,工信部职责、机构、编制调整
普通新闻 荣耀Magic Vs2系列正式发布,刷新横向大内折手机轻薄纪录
普通新闻 GSMA首席技术官:全球连接数超15亿,5G推动全行业数字化转型
普通新闻 北京联通完成全球首个F5G-A“单纤百T”现网验证,助力北京迈向万兆
普通新闻 中科曙光亮相2023中国移动全球合作伙伴大会
普通新闻 最高补贴500万元!哈尔滨市制定工业互联网专项资金使用细则
通信视界
邬贺铨:移动通信开启5G-A新周期,云网融合/算
普通对话 中兴通讯徐子阳:强基慧智,共建数智热带雨
普通对话 邬贺铨:移动通信开启5G-A新周期,云网融合
普通对话 华为轮值董事长胡厚崑:我们正努力将5G-A带
普通对话 高通中国区董事长孟樸:5G与AI结合,助力提
普通对话 雷军发布小米年度演讲:坚持做高端,拥抱大
普通对话 闻库:算网融合正值挑战与机遇并存的关键阶
普通对话 工信部副部长张云明:我国算力总规模已居世
普通对话 邬贺铨:我国互联网平台企业发展的新一轮机
普通对话 张志成:继续加强海外知识产权保护工作 为助
普通对话 吴春波:华为如何突破美国6次打压的逆境?
通信前瞻
亨通光电实践数字化工厂,“5G+光纤”助力新一
普通对话 亨通光电实践数字化工厂,“5G+光纤”助力新
普通对话 中科院钱德沛:计算与网络基础设施的全面部
普通对话 工信部赵志国:我国算力总规模居全球第二 保
普通对话 邬贺铨院士解读ChatGPT等数字技术热点
普通对话 我国北方海区运用北斗三号短报文通信服务开
普通对话 华为云Stack智能进化,三大举措赋能政企深度
普通对话 孟晚舟:“三大聚力”迎接数字化、智能化、
普通对话 物联网设备在智能工作场所技术中的作用
普通对话 软银研发出以无人机探测灾害被埋者手机信号
普通对话 AI材料可自我学习并形成“肌肉记忆”
普通对话 北斗三号卫星低能离子能谱仪载荷研制成功
普通对话 为什么Wi-Fi6将成为未来物联网的关键?
普通对话 马斯克出现在推特总部 收购应该没有悬念了
普通对话 台积电澄清:未强迫员工休假或有任何无薪假
普通对话 新一代载人运载火箭发动机研制获重大突破
推荐阅读
Copyright @ Cntxj.Net All Right Reserved 通信界 版权所有
未经书面许可,禁止转载、摘编、复制、镜像