lua学习笔记---面向对象

在 Lua 中,封装主要通过元表(metatable)来实现。元表可以定义 __index__newindex__call 等元方法来控制对表的访问和赋值行为。

  • __index 元方法:当尝试访问一个不存在的键时,Lua 会查找元表的 __index 字段。如果 __index 是一个表,Lua 会在该表中查找键。这允许我们定义一个“类”的属性和方法,然后让所有实例共享这些属性和方法,从而实现封装。

  • __newindex 元方法:当尝试给一个不存在的键赋值时,Lua 会查找元表的 __newindex 字段。这可以用来控制对属性的赋值行为,例如,可以在这里添加日志记录或者验证逻辑。

在 Lua 中,继承是通过元表的 __index 元方法实现的。当你尝试访问一个表的属性或方法时,如果该表没有这个属性或方法,Lua 会查看该表的元表的 __index 字段。如果 __index 是另一个表,Lua 会在那个表中查找属性或方法,这个过程会一直进行,直到找到属性或方法,或者 __indexnil

print("--------面向对象----------------")
print("------------------封装-----------------")
Object={}--定义了一个名为 Object 的空表,它将作为我们的“类”
function Object:Test()--定义了一个名为 Test 的方法,它属于 Object 类。在 Lua 中,冒号 : 用于表示方法,它实际上是语法糖,等同于 Object.Test(self)-- bodyprint(self.id)
end
Object.id=1
function Object:new()--[[new 函数是一个构造函数,用于创建 Object 类的新实例。这里创建了一个空表 obj,并设置其元表的 __index 为 self(即 Object),这样 obj 就可以访问 Object 中定义的属性和方法。最后返回这个新对象。]]local obj={}self.__index=selfsetmetatable(obj,self)return obj
end
local myObj = Object:new()--这里通过调用 Object:new() 创建了一个 Object 类的新实例 myObj
print(myObj.id)--这里打印 myObj 的 id 属性,并调用其 Test 方法 由于 id 是从 Object 继承来的,所以打印的是 1
myObj:Test()
myObj.id=2--对空表中声明一个新的属性
print(Object.id)
myObj:Test()
print("------------------继承-----------------")
--写一个用于继承的方法
function Object:subClass( className )--_G是总表 所有声明的全局变量都以键值对的形式存在其中_G[className]={}--写相关继承的规则local obj = _G[className]self.__index=selfobj.base=self--定义一个base属性,代表父类setmetatable(obj,self)
end
Object:subClass("Person")
print(Person.id) 
local p = Person:new()
print(p.id)
print("------------------多态-----------------")
--相同行为不同表现
Object:subClass("GameObject")
GameObject.posX=0
GameObject.posY=0
function GameObject:Move()self.posX=self.posX+1self.posY=self.posY+1print(self.posX)print(self.posY)
end
GameObject:subClass("Player")
local p1 = Player:new()
function Player:Move()self.base.Move(self)
end
p1:Move()
local p2 = Player:new()
p2:Move()
p1:Move()

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

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

相关文章

第15课 算法(下)

掌握冒泡排序、选择排序、插入排序、顺序查找、对分查找的的基本原理,并能使用这些算法编写简单的Python程序。 一、冒泡排序 1、冒泡排序的概念 冒泡排序是最简单的排序算法,是在一列数据中把较大(或较小)的数据逐次向右推移的…

golang通用后台管理系统03(登录校验,并生成token)

代码 package serviceimport ("fmt"//"fmt""gin/common""gin/config"sysEntity "gin/system/entity"sysUtil "gin/system/util""github.com/gin-gonic/gin""log" )func Login(c *gin.Contex…

Java环境下配置环境(jar包)并连接mysql数据库

目录 jar包下载 配置 简单连接数据库 一、注册驱动(jdk6以后会自动注册) 二、连接对应的数据库 以前学习数据库就只是操作数据库,根本不知道该怎么和软件交互,将存储的数据读到软件中去,最近学习了Java连接数据库…

快速遍历包含合并单元格的Word表格

Word中的合并表格如下,现在需要根据子类(例如:果汁)查找对应的品类,如果这是Excel表格,那么即使包含合并单元格,也很容易处理,但是使用Word VBA进行查找,就需要一些技巧。…

「C/C++」C/C++标准库 之 #include<ctime> 时间日期库

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

写论文随想(整理我自己的感悟)(不断更新中,废案按照删除号标记)

写论文随想(整理我自己的感悟)(不断更新中,废案按照删除号标记) 论文的所有内容,都是为了服务于自己的创新点,只要整个文章围绕这个创新点讲好了,一篇自己满意的文章就成了。这也就是我现在的目…

使用wordcloud与jieba库制作词云图

目录 一、WordCloud库 例子: 结果: 二、Jieba库 两个基本方法 jieba.cut() jieba.cut_for_serch() 关键字提取: jieba.analyse包 extract_tags() 一、WordCloud库 词云图,以视觉效果提现关键词,可以过滤文本…

深入解析缓存模式下的数据一致性问题

今天,我们来聊聊常见的缓存模式和数据一致性问题。 常见的缓存模式有:Cache Aside、Read Through、Write Through、Write Back、Refresh Ahead、Singleflight。 缓存模式 Cache Aside 在 Cache Aside 模式中,是把缓存当做一个独立的数据源…

第四篇: 用Python和SQL在BigQuery中进行基础数据查询

用Python和SQL在BigQuery中进行基础数据查询 在大数据分析领域,Google BigQuery 提供了一种快速且经济高效的数据处理方式。对于想要使用SQL查询大规模数据的读者来说,BigQuery的公共数据集资源丰富、操作简便,是学习和实践SQL基础操作的理想…

Spring学习笔记_19——@PostConstruct @PreDestroy

PostConstruct && PreDestroy 1. 介绍 PostConstruct注解与PreDestroy注解都是JSR250规范中提供的注解。 PostConstruct注解标注的方法可以在创建Bean后在为属性赋值后,初始化Bean之前执行。 PreDestroy注解标注的方法可以在Bean销毁之前执行。 2. 依赖…

11.4模拟赛总结

文章目录 时间安排成绩反思 时间安排 7 : 40 − 8 : 00 7:40 - 8:00 7:40−8:00 开题。把题都看了一遍。 T 1 T1 T1 看起来有点神秘。 T 2 T2 T2 想很难的构造。 T 3 T3 T3 看起来像比较正常的计数题。 T 4 T4 T4 应该是扫描线 8 : 00 − 9 : 20 8:00 - 9:20 8:00−9:20 尝试…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮,会让细节别的更明显。膨胀也是形态学中的一种操作,在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作,可以构成开闭操作。 开操作是先腐蚀…

多线程和线程同步基础篇学习笔记(Linux)

大丙老师教学视频:10-线程死锁_哔哩哔哩_bilibili 目录 大丙老师教学视频:10-线程死锁_哔哩哔哩_bilibili 线程概念 为什么要有线程 线程和进程的区别 在处理多任务的时候为什么线程数量不是越多越好? Linux提供的线程API 主要接口 线程创建 pth…

jeecgbootvue2菜单路由配置静态文件夹(public)下的html

需求:想要在菜单配置src/assets/iconfont/chart.html显示页面(目的是打包上线以后运维依然可以修改数据) 官网没有相关数据:菜单配置说明 JeecgBoot 开发文档 看云 问题现象: 我把文件放在src/assets/iconfont/chart.html然后在vue中作为 iframe 的 src 属性&am…

3种AI黑科技,让照片中的人物开口说话的简易方法,快进来学!

本文背景 用AI工作这么久了,我经常碰到各种关于AI的问题,比如制作让照片中人物开口说话的数字人。 很多小伙伴想知道是怎么弄的,不知从何下手。不过不用担心,今天就给大家带来三种实用的方法,快来一起试试吧。 首先是腾…

【docker compose】docker compose的hello world

安装docker desktop后在终端使用以下命令,代表安装成功,并查看当前安装的版本 docker-compose --version示例docker-compose.yml文件 version: 3.8 # 指定 Docker Compose 文件的版本services:scau_jwc: # 定义一个名为 scau_jwc 的服务image: scau_…

【js逆向学习】某多多anti_content逆向(补环境)

文章目录 声明逆向目标逆向分析逆向过程总结 声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的…

【C++】动态内存

一、内存区域分布 首先我们来看一段代码并尝试解决以下问题: 1. GlobalVar是全局变量,存储在数据段(静态区),选C。2. staticGlobalVar是静态全局变量,也存储在数据段(静态区)&#x…

基于STM32的温湿度监测器教学

引言 随着科技的发展,温湿度监测在农业、仓储、环境监测等领域的应用越来越广泛。本文将指导您如何基于STM32开发一个简单的温湿度监测器,使用常用的DHT11或DHT22传感器进行数据采集,并将监测结果显示在LCD或OLED屏幕上。 项目名称 STM32温湿…

哈希表,哈希桶及配套习题

我们今天带大家简单了解哈希表是怎样的,和简单模拟哈希桶,还有几道练习题 一,哈希表 什么是哈希表,哈希表是一种非常非常高效的数据结构,它用来搜索我们想要的数据,我们之前学过很多查找方法,最…