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

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

 

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

 

 

 
 热点技术
普通技术 网络认知对抗的中文学术研究历史演进研究
普通技术 境外认知战作战力量及技术装备综述
普通技术 我国当前面临的主要网络认知威胁分析
普通技术 提升工业和硬件安全!我国牵头提出的两项网安国际标准发布
普通技术 6G通信感知一体化网络的感知算法研究与优化
普通技术 多地址的时间型区块链隐蔽通信方法研究
普通技术 基于CHAN 的改进卡尔曼滤波室内定位算法
普通技术 基于吸收马尔可夫链攻击图的网络攻击分析方法研究
普通技术 短波通信接入网广域协作资源分配算法
普通技术 基于子载波补给索引调制的OFDM 传输方案
普通技术 基于随机Transformer 的多维时间序列异常检测模型
普通技术 面向高混响环境的欠定卷积盲源分离算法
普通技术 移动边缘计算网络下基于静态贝叶斯博弈的入侵响应策略研究
普通技术 基于IRS辅助的MIMO车联网系统联合波束成形设计
普通技术 基于IOC-CSMP 的OFDM 系统稀疏信道快速重构算法
普通技术 频控阵MIMO雷达的目标数与方位参数联合估计方法
普通技术 SPS 结构大规模S 盒设计与分析
普通技术 意图抽象与知识联合驱动的6G 内生智能网络架构
普通技术 软件定义网络抗拒绝服务攻击的流表溢出防护
普通技术 数据安全中台构筑企业数据生命线
  版权与免责声明: ① 凡本网注明“合作媒体:通信界”的所有作品,版权均属于通信界,未经本网授权不得转载、摘编或利用其它方式使用。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:通信界”。违反上述声明者,本网将追究其相关法律责任。 ② 凡本网注明“合作媒体:XXX(非通信界)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。 ③ 如因作品内容、版权和其它问题需要同本网联系的,请在一月内进行。
通信视界
吴春波:华为如何突破美国6次打压的逆境?
刘烈宏:以数字化网络化智能化助力数字经济与
普通对话 高通中国区董事长孟樸:5G与AI结合,助力提升
普通对话 雷军发布小米年度演讲:坚持做高端,拥抱大模
普通对话 闻库:算网融合正值挑战与机遇并存的关键阶段
普通对话 工信部副部长张云明:我国算力总规模已居世界
普通对话 邬贺铨:我国互联网平台企业发展的新一轮机遇
普通对话 张志成:继续加强海外知识产权保护工作 为助力
普通对话 吴春波:华为如何突破美国6次打压的逆境?
普通对话 刘烈宏:以数字化网络化智能化助力数字经济与
普通对话 消息称微软将把OpenAI人工智能技术整合至Offi
普通对话 中国电信董事长柯瑞文:数字科技引领新消费
普通对话 中国移动董事长杨杰出席GSMA创新论坛并作主旨
普通对话 中国信科何书平:“一体两翼”大力支撑数字政
普通对话 中兴徐子阳:泛在协同,筑“算网”坦途
普通对话 中国移动陈国:智慧中台对外输出数百项高价值
普通对话 中兴通讯总裁徐子阳:数贯东西,融达天下,共
通信前瞻
亨通光电实践数字化工厂,“5G+光纤”助力新一
邬贺铨院士解读ChatGPT等数字技术热点
普通对话 亨通光电实践数字化工厂,“5G+光纤”助力新一
普通对话 中科院钱德沛:计算与网络基础设施的全面部署
普通对话 工信部赵志国:我国算力总规模居全球第二 保持
普通对话 邬贺铨院士解读ChatGPT等数字技术热点
普通对话 我国北方海区运用北斗三号短报文通信服务开展
普通对话 华为云Stack智能进化,三大举措赋能政企深度用
普通对话 孟晚舟:“三大聚力”迎接数字化、智能化、低
普通对话 物联网设备在智能工作场所技术中的作用
普通对话 软银研发出以无人机探测灾害被埋者手机信号的
普通对话 AI材料可自我学习并形成“肌肉记忆”
普通对话 北斗三号卫星低能离子能谱仪载荷研制成功
普通对话 为什么Wi-Fi6将成为未来物联网的关键?
普通对话 马斯克出现在推特总部 收购应该没有悬念了
普通对话 台积电澄清:未强迫员工休假或有任何无薪假计
普通对话 新一代载人运载火箭发动机研制获重大突破