无涯教程-Lua - 面向对象
面向对象编程(OOP)是现代编程时代中使用最广泛的编程技术之一。
OOP的特征
类(Class) - 类是用于创建对象的可扩展模板。
对象(Objects) - 它是类的实例,并为其分配了单独的内存空间。
继承(Inheritance) - 这是一个概念,一个类的变量和函数被另一类继承。
封装(Encapsulation) - 这是将数据和函数合并到一个类中的过程。
您可以借助Table和Lua的一流函数在Lua中实现面向对象。通过将函数和相关数据放入表中,可以形成一个对象。继承可以在Meta的帮助下实现,它为父对象中不存在的函数(方法)和字段提供了一种查找机制。
Lua中的Table具有独立其值的对象特征。具有相同值的两个对象是不同的对象,而一个对象在不同时间可以具有不同的值,但是它始终是同一对象。
让无涯教程考虑一个简单的数学示例。经常遇到需要处理不同形状(如圆形,矩形和正方形)的情况。
形状可以具有公共属性Area。因此,可以从具有公共属性区域的基础对象形状扩展其他形状。每个形状都可以具有自己的属性和函数,如矩形可以具有属性长度,宽度,面积作为其属性,以及printArea和calculateArea作为其函数。
创建类
下面显示了具有三个属性区域,长度和宽度的矩形的简单类实现。它还具有printArea函数以打印计算出的区域。
-- Meta class Rectangle = {area = 0, length = 0, breadth = 0}-- Derived class method newfunction Rectangle:new (o,length,breadth)o = o or {}setmetatable(o, self)self.__index = selfself.length = length or 0self.breadth = breadth or 0self.area = length*breadth;return o end-- Derived class method printAreafunction Rectangle:printArea ()print("The area of Rectangle is ",self.area) end
创建对象
创建对象是为类分配内存的过程。每个对象都有其自己的内存并共享公共类数据。
r=Rectangle:new(nil,10,20)
访问属性
无涯教程可以使用点运算符访问类中的属性,如下所示:
print(r.length)
访问函数
您可以使用带有该对象的冒号运算符访问成员函数,如下所示-
r:printArea()
分配内存并设置初始值。可以将初始化过程与其他面向对象语言的构造函数进行比较。
完整的示例
来看一个在Lua中使用面向对象的完整示例。
-- Meta class Shape = {area = 0}-- Base class method newfunction Shape:new (o,side)o = o or {}setmetatable(o, self)self.__index = selfside = side or 0self.area = side*side;return o end-- Base class method printAreafunction Shape:printArea ()print("The area is ",self.area) end-- Creating an object myshape = Shape:new(nil,10)myshape:printArea()
当您运行上述程序时,您将获得以下输出。
The area is 100
Lua 继承
继承是将简单的基础对象(如形状)扩展为矩形,正方形等的过程。它在现实世界中经常用于共享和扩展基本属性和函数。
来看一个简单的类扩展。有一个如下所示的类。
-- Meta class Shape = {area = 0}-- Base class method newfunction Shape:new (o,side)o = o or {}setmetatable(o, self)self.__index = selfside = side or 0self.area = side*side;return o end-- Base class method printAreafunction Shape:printArea ()print("The area is ",self.area) end
可以将形状扩展到方形,如下所示。
Square = Shape:new()-- Derived class method newfunction Square:new (o,side)o = o or Shape:new(o,side)setmetatable(o, self)self.__index = selfreturn o end
Lua 覆盖
可以覆盖基类函数,而不是使用基类中的函数,派生类可以有自己的实现,如下所示:
-- Derived class method printAreafunction Square:printArea ()print("The area of square is ",self.area) end
Lua 继承示例
无涯教程可以借助另一个新方法,借助元表,来扩展Lua中的简单类实现,如上所示。基类的所有成员变量和函数都保留在子类中。
-- Meta class Shape = {area = 0}-- Base class method newfunction Shape:new (o,side)o = o or {}setmetatable(o, self)self.__index = selfside = side or 0self.area = side*side;return o end-- Base class method printAreafunction Shape:printArea ()print("The area is ",self.area) end-- Creating an object myshape = Shape:new(nil,10) myshape:printArea()Square = Shape:new()-- Derived class method newfunction Square:new (o,side)o = o or Shape:new(o,side)setmetatable(o, self)self.__index = selfreturn o end-- Derived class method printAreafunction Square:printArea ()print("The area of square is ",self.area) end-- Creating an object mysquare = Square:new(nil,10) mysquare:printArea()Rectangle = Shape:new()-- Derived class method newfunction Rectangle:new (o,length,breadth)o = o or Shape:new(o)setmetatable(o, self)self.__index = selfself.area = length * breadthreturn o end-- Derived class method printAreafunction Rectangle:printArea ()print("The area of Rectangle is ",self.area) end-- Creating an objectmyrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
当运行上面的程序时,将获得以下输出-
The area is 100 The area of square is 100 The area of Rectangle is 200
在上面的示例中,从基类Square创建了两个派生类-Rectangle和Square。可以在派生类中重写基类的函数。在此示例中,派生类覆盖函数printArea。
Lua - 面向对象 - 无涯教程网无涯教程网提供面向对象编程(OOP)是现代编程时代中使用最广泛的编程技术之一。 OOP的特征 类(Class) ...https://www.learnfk.com/lua/lua-object-oriented.html
相关文章:

无涯教程-Lua - 面向对象
面向对象编程(OOP)是现代编程时代中使用最广泛的编程技术之一。 OOP的特征 类(Class) - 类是用于创建对象的可扩展模板。 对象(Objects) - 它是类的实例,并为其分配了单独的内存空间。 继承(Inheritance) - 这是一个概…...
Java中的IOUtils是什么?
Java中的IOUtils是一个工具类,用于简化文件和流的操作。它提供了一些常用的方法,如复制文件、读取文件、写入文件等。 下面是一个简单的示例,演示如何使用IOUtils来复制文件: import org.apache.commons.io.FileUtils; import j…...

电源板(220V转3.3V)调试问题总
目录 现象: 问题可能的影响: 排查过程: 1.测试EC3,C2都在6V左右, 2.怀疑变压器的问题。 2.怀疑原边反馈控制芯片的问题。 3.怀疑后级电路的问题。 现象: 电源板输出3.28V输出正常。 但是测试前级电压…...
【webpack】一些零碎的知识点记录:eslint配置、source-map配置、devServer配置
文章目录 前言eslint安装配置设置规则 devtool设置js.map文件使用模式解释文件说明建议方案 devServer安装配置 前言 有些知识点不知道咋归类,就先暂时放在同一个文章里了。这里只记录配置方式,配置的东西是什么就不过多解释了,因为一般需要…...

VUE之JWT前后端分离认证,学生管理系统
参考资料: SpringBoot搭建教程 SpringCloud搭建教程 JWT视频教程 JWT官网 Vue视频教程 JWT视频参考资料、VUE视频资料,及前后端demo 特别有参考价值的JWT博客1 特别有参考价值的JWT博客2 cookie、localstorage和sessionStorage的区别1 cookie、localstorage和sessi…...

Go学习第五天
Golang中面向对象类的表示与封装 package mainimport "fmt"// 如果类名首字母大写,表示其他包也能够访问 type Hero struct {// 如果类的属性首字母大写,表示该属性是对外能够访问的,否则的话只能够类的内部访问Name stringAd …...
在vue项目中封装WebSockets请求
在Vue项目中封装WebSocket请求包括以下步骤: 1. 安装WebSocket库:首先,导入WebSocket库,例如vue-native-websocket或socket.io-client。根据项目需求选择适当的库,并根据官方文档进行安装和配置。 2. 创建WebSocket服务…...

Linux进程(二)
文章目录 进程(二)Linux的进程状态R (running)运行态S (sleeping)阻塞状态D (disk sleep)深度睡眠T(stopped)状态X(dead)状态Z&#x…...

使用pg_prewarm缓存PostgreSQL数据库表
pg_prewarm pg_prewarm 直接利用系统缓存的代码,对操作系统发出异步prefetch请求,在应用中,尤其在OLAP的情况下,对于大表的分析等等是非常耗费查询的时间的,而即使我们使用select table的方式,这张表也并不可能将所有…...

LeetCode 28题:找出字符串中第一个匹配项的下标
题目 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystac…...

flink+kafka+doris+springboot集成例子
目录 一、例子说明 1.1、概述 1.1、所需环境 1.2、执行流程 二、部署环境 2.1、中间件部署 2.1.1部署kakfa 2.1.1.1 上传解压kafka安装包 2.1.1.2 修改zookeeper.properties 2.1.1.3 修改server.properties 2.1.1.3 启动kafka 2.1.2、部署flink 2.1.2.1 上传解压f…...
ARM裸机-14(S5PV210的时钟系统)
1、时钟系统 1.1、什么是时钟 时钟是同步工作系统的同步节拍 1.2、SoC为什么需要时钟 Soc内部有很多器件,例如CPU、串口、DRAM控制制器、GPIO等内部外设,这些东西要彼此协同工作,需要一个同步的时钟系统来指挥。这个就是我们SoC的时钟系统。…...

Milvus Cloud凭借AI原生,可视化优势荣登全球向量数据库性能排行榜VectorDBBench.com 榜首
在当今的大数据时代,随着人工智能技术的快速发展,向量数据库作为处理大规模数据的关键工具,其性能和效率越来越受到关注。最近,全球向量数据库性能排行榜 VectorDBBench.com 公布了一份最新的评估报告,引人瞩目的是,成立不到一年的新兴公司 Milvus Cloud 凭借其 AI 原生和…...

测试岗?从功能测试进阶自动化测试开发,测试之路不迷茫...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试新人在想什么…...

算法与数据结构(五)--树【1】树与二叉树是什么
一.树的定义 树是一个具有层次结构的集合,是由一个有限集和集合上定义的一种层次结构关系构成的。不同于线性表,树并不是线性的,而是有分支的。 树(Tree)是n(n>0)个结点的有限集。 若n0&…...

打开的idea项目maven不生效
方法一:CtrlshiftA(或者help---->find action), 输入maven, 点击add maven projects,选择本项目中的pom.xml配置文件,等待加载........ 方法二:view->tools windows->mave…...

kvm+qemu+libvirt管理虚机
virt-manager 图形化创建虚拟机 #virt-manager纳管远程kvm虚拟机 # 可以指定kvm虚机的ssh端口和virt-manager所在主机的私钥 virt-manager -c qemussh://root10.197.115.17:5555/system?keyfileid_rsa --no-fork # 如果你生成的ssh-key 的名称是 test-key,在/home/ssh-key/ 目…...

电气防火限流式保护器在汽车充电桩使用上的作用
【摘要】 随着电动汽车行业的不断发展,电动汽车充电设施的使用会变得越来越频繁和广泛。根据中汽协数据显示,2022年上半年,我国新能源汽车产销分别完成266.1万辆和260万辆,同比均增长1.2倍,市场渗透率达21.6%。因此,电动汽车的安全…...

VBA技术资料MF38:VBA_在Excel中隐藏公式
【分享成果,随喜正能量】佛祖也无能为力的四件事:第一,因果不可改,自因自果,别人是代替不了的;第二,智慧不可赐,任何人要开智慧,离不开自身的磨练;第三&#…...

Gson:解析JSON为复杂对象:TypeToken
需求 通过Gson,将JSON字符串,解析为复杂类型。 比如,解析成如下类型: Map<String, List<Bean>> 依赖(Gson) <dependency><groupId>com.google.code.gson</groupId><art…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...