您现在的位置: 通信界 >> 接入系统 >> 技术正文  
 
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

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

 

作者:道哥 合作媒体:通信界 编辑:顾北

 

 

 
 热点技术
普通技术 Lua面向对象编程的基本原理示例
普通技术 Arm Neoverse路线图再添新丁!为全球计算基础设施奠定新的起点
普通技术 世界越来越热,数据中心可不能跟着升温
普通技术 用户带宽增长驱动核心路由器演进
普通技术 赋能下一代5G平台
普通技术 航天新通QSite,助力5G新基建
普通技术 5G+4G无线网络协同及组网关键技术探讨
普通技术 面向5G前传的半有源WDM技术创新
普通技术 亚马逊云计算迎来史上最低增速 营收利润未达华尔街预期
普通技术 华为王金平:扩大体验红利格局,引领体验经营时代
普通技术 兔宝宝质量新突破,“康耐板”解决生态板行业难题
普通技术 无源物联网如何大规模应用?飞英思特“环境取能”技术成破局关键
普通技术 基于传感器的气象环境网格监测系统有效改善环境问题
普通技术 【技术分享】持续升级的TWS方案
普通技术 超声波触控技术:可穿戴设备和大型显示屏市场的新爆点
普通技术 5G中的DPD技术,怎么玩?
普通技术 ModbusTCP协议报文详细分析
普通技术 5G NR中的HARQ机制基本原理
普通技术 Massive MIMO技术应用场景
普通技术 工业自动化发展经历了哪几个阶段?
  版权与免责声明: ① 凡本网注明“合作媒体:通信界”的所有作品,版权均属于通信界,未经本网授权不得转载、摘编或利用其它方式使用。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:通信界”。违反上述声明者,本网将追究其相关法律责任。 ② 凡本网注明“合作媒体:XXX(非通信界)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。 ③ 如因作品内容、版权和其它问题需要同本网联系的,请在一月内进行。
通信视界
韦乐平:网络深度转型最明确的方向首先就是云
爱立信中国区总裁方迎:将在中国市场重点做好
普通对话 NVIDIA发力数字孪生:站在虚拟和现实之间
普通对话 韦乐平:网络深度转型最明确的方向首先就是云
普通对话 中国工程院院士邬贺铨:6G标准面临小圈子风险
普通对话 华为丁耘:绿色ICT,共创新价值
普通对话 爱立信中国区总裁方迎:将在中国市场重点做好
普通对话 中国联通买彦州:广电5G商用对行业竞争格局不
普通对话 中国联通陈忠岳:从“提速降费”向“提速提质
普通对话 华为胡厚崑:5G+工业互联网 数据驱动是关键
普通对话 华为郭平:每个人磨好自己的豆腐,就会有一个
普通对话 中国移动杨杰:加快推进新型平台用工模式规范
普通对话 中国移动简勤:5G引领数字化转型 终端承载应用
普通对话 专访GSMA刘鸿:5G专网谁来建?运营商是最佳选
普通对话 华为甘斌:预计2021年5G用户将超5亿
普通对话 郄勇志:小米被美拉黑事件启示:实现科技自立
普通对话 闻库:要有打造“数字中国 光网底座”的使命感
通信前瞻
中国移动李慧镝:强化数智基建驱动 推进产业转
苏少林:打造北京数字经济“五强”,助力标杆
普通对话 多管齐下,VMware跨云服务助力企业云转型
普通对话 中国移动李慧镝:强化数智基建驱动 推进产业转
普通对话 苏少林:打造北京数字经济“五强”,助力标杆
普通对话 中国科大在高安全量子密钥分发网络方面取得新
普通对话 华为杨超斌:迈向5.5G持续创新,开启5G产业新
普通对话 中国联通买彦州:加强创新力度,协同推进6G技
普通对话 信通院总工敖立:5G工业模组是产业链特别短板
普通对话 中兴通讯首席发展官崔丽:澎湃“数”动能,助
普通对话 中国移动赵大春:力推北斗与5G产业深度融合
普通对话 信通院徐菲:争取2021年实现端到端网络切片自
普通对话 杨泽民:光网络发展挑战与机遇并存
普通对话 张杰:“双千兆”发展面临四大核心挑战
普通对话 中国移动董事长杨杰:共创信息服务新生态 共拓
普通对话 王志勤:“5G+工业互联网”产业发展初期仍面临
普通对话 中国电信董事长柯瑞文:5G+云网,助力VR产业发