Lua实现面向对象以及类的继承
0.简单前言
1、面向对象主要四个特征:封装,继承,多态,抽象
2、Lua是种简单精致小巧的语言,其本质是个表(table),变量和方法皆可看作为该表的元素。
P.S. 该博客和代码为个人编写习惯以及为后续博客内容拓展服务考虑,若有错误等不周到的地方还请包涵以及指出。
1.类
尽管可能不太完美,但我们依旧可以通过元表的方式实现类以及类的继承。
-- 元类
local Rectangle = {area = 0, length = 0, breadth = 0}-- 派生类的方法 new
function Rectangle:new (o,length,breadth)local o = o or {}setmetatable(o, self) -- 将Rectangle赋值给要返回的对象作为元表self.__index = self -- 通过 .__index 传递元表元素self.length = length or 0self.breadth = breadth or 0self.area = length*breadth;return o
end-- 派生类的方法 printArea
function Square:printArea ()print("矩形面积为 ",self.area)
end
简单结构就是这样,Square类已经继承Rectangle的属性以及方法,同时还拓展出自己的新方法 printArea(),但实际运用起来并不方便。
2.改进
class类
用于构建模板以及进行类的继承
Class.lua
-- params:要实例的类,继承
function class(classname , ...)local cls = {}local supers = {...}for _ , super in ipairs(supers) dolocal superType = type(super)if superType == "function" thencls.__create = superelseif superType == "table" thencls.__supers = cls.__supers or {}cls.__supers[#cls.__supers + 1] = superendendcls.__index = clscls.__class = classnameif not cls.__supers then-- 没有继承其他类-- 添加默认构造函数-- __index指向自己不变cls.Ctor = function() end elseif #cls.__supers == 1 then-- 单继承的情况local super = cls.__supers[1]cls = setmetatable(cls , {__index = super})cls.super = super -- 模拟super关键字else -- 多继承的情况-- 使index指向一个函数,在索引时遍历父类cls = setmetatable(cls , {__index = function(_ , key)for _ , super in ipairs(cls.__supers) doif super[key] thenreturn super[key]endendend})endcls.New = function(...)-- 前面只是将几个类进行合并,因此在实例时还需进行一次元表local instance = setmetatable({}, cls)instance.class = clsinstance:Ctor(...)return instanceend-- 返回实例return cls
end
实验
创建4个脚本A,B,C,D。
使得C继承A,
D继承A,B。
A.lua
A = class(A)function A:Ctor()print("We create a class A!")
endfunction A:Fun_A()print("This is a function from class A!")
endreturn A
B.lua
B = class(B)function B:Ctor()print("We create a class B!")
endfunction B:Fun_B()print("This is a function from class B!")
endreturn B
C.lua
C = class(C , A) -- 让C类单独继承A类function C:Ctor()print("We create a class C!")
endfunction C:Fun_C()print("This is a function from class C!")
endreturn C
D.lua
D = class(D , A , B) -- 让D类同时继承A,B类function D:Ctor()print("We create a class D!")
endfunction D:Fun_D()print("This is a function from class D!")
endreturn D
检验
main.lua
-- 实例以及覆写方法
local test_c = C:New()
local test_d = D:New()-- 子类自身的方法
test_c:Fun_C()
test_d:Fun_D()-- 子类继承的方法
test_c:Fun_A()
test_d:Fun_A()
test_d:Fun_B()-- 没有继承的方法
-- test_c:Fun_B()
结果
We create a class C!
We create a class D!
This is a function from class C!
This is a function from class D!
This is a function from class A!
This is a function from class A!
This is a function from class B!
若把注释取消,则直接报attempt to call a nil value (method ‘Fun_B’)
相关文章:
Lua实现面向对象以及类的继承
0.简单前言 1、面向对象主要四个特征:封装,继承,多态,抽象 2、Lua是种简单精致小巧的语言,其本质是个表(table),变量和方法皆可看作为该表的元素。 P.S. 该博客和代码为个人编写习…...
机器学习课程学习周报五
机器学习课程学习周报五 文章目录 机器学习课程学习周报五摘要Abstract一、机器学习部分1.1 向量序列作为模型输入1.1.1 文字的向量表达1.1.2 语音的向量表达 1.2 自注意力机制原理1.2.1 自注意力机制理论1.2.2 矩阵运算自注意力机制 1.3 多头自注意力1.4 位置编码1.5 截断自注…...
vue3.0学习笔记(二)——生命周期与响应式数据(ref,reactive,toRef,toRefs函数)
1. 组合API-setup函数 使用细节: setup 是一个新的组件选项,作为组件中使用组合API的起点。从组件生命周期来看,它的执行在组件实例创建之前vue2.x的beforeCreate执行。这就意味着在setup函数中 this 还不是组件实例,this 此时是…...
C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序
登录官网,在官网选择合适的qt版本进行下载 这里选择5.12.9版本 点击exe文件下载,因为服务器在国外,国内不支持,所以可以从我的网盘下载 链接: https://pan.baidu.com/s/1XMILFS1uHTenH3mH_VlPLw 提取码: 1567 --来自百度网盘超级…...
掌握互联网路由选择协议:从基础入门到实战
文章目录 路由选择协议的基本概念路由选择算法的分类分层次的路由选择协议路由信息协议(RIP)内部网关协议:OSPF外部网关协议:BGP互联网中的实际应用总结 互联网的路由选择协议是网络通信的核心,它决定了数据包如何在网…...
[笔记]ONVIF服务端实现[进行中...]
1.文档搜索: 从:https://www.cnblogs.com/liwen01/p/17337916.html 跳转到了:ONVIF协议网络摄像机(IPC)客户端程序开发(1):专栏开篇_onvif 许振坪-CSDN博客 1.1原生代码支持&…...
深度强化学习 ②(DRL)
参考视频:📺王树森教授深度强化学习 前言: 最近在学习深度强化学习,学的一知半解😢😢😢,这是我的笔记,欢迎和我一起学习交流~ 这篇博客目前还相对比较乱,后面…...
线性代数重要知识点和理论(下)
奇异值分解 奇异值分解非常重要且有趣。首先对于 n n n\times n nn对称矩阵 A A A,可以通过对角化得到其对角化形式 A P D P − 1 APDP^{-1} APDP−1,但是如果 A A A不是对称矩阵或者不是方阵,则不能进行对角化,但是可以通过奇…...
独立开发者系列(35)——python环境的理解
新手阶段,为了快速入门,基本都是直接开始写python代码实现自己想要的效果,类似搭建博客,写个web服务器,搭建简易聊天室,偶尔也写些爬虫,或者使用pygame写个简单小游戏,也有tk库做点简…...
中小企业常见的网络安全问题及防范措施
在数字化浪潮的推动下,我国中小企业的信息化建设取得了显著成就。然而,随着网络安全形势的日益严峻,中小企业在网络安全方面的短板逐渐暴露出来。本文将从中小企业网络安全现状出发,深入剖析其存在的问题,并提出针对性…...
Android 线程并发:线程通信:Handler机制
文章目录 API源码分析操作总结 API Handler相关 Handler对象.sendMessage(Message) 发送消息 Handler对象.handleMessage()空方法 自定义Handler重写handleMessage方法,处理Message Looper相关 Looper.getMainLooper() 获取App的UI线程的Looper对象 Looper…...
搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表
深交所的股票信息读取比较简单: 看上图,爬虫读取到下载按钮的链接之后发起请求,得到XLS文件后直接解析就可以了。 这里放出深交所爬虫模块的代码: # -*- coding: utf-8 -*- # 深圳交易所爬虫 import osimport pandas as pd imp…...
企业级视频拍摄与编辑SDK的全面解决方案
视频已成为企业传播信息、展示品牌、连接用户的重要桥梁,如何高效、专业地制作高质量视频内容,成为众多企业面临的共同挑战。美摄科技,作为视音频技术领域的创新先锋,以其强大的视频拍摄与编辑SDK,为企业量身打造了一站…...
后端返回列表中包含图片id,如何将列表中的图片id转化成url
问题描述 如果我有一个列表数据,列表中每个对象都包含一个图片id,现在我需要将列表中的图片id转化成图片,然后再页面上显示出来 如果你有一个列表数据,列表中每个对象都包含一个图片 ID,并且你想将这些图片 ID 转化为…...
Python学习笔记44:游戏篇之外星人入侵(五)
前言 上一篇文章中,我们成功的设置好了游戏窗口的背景颜色,并且在窗口底部中间位置将飞船加载出来了。 今天,我们将通过代码让飞船移动。 移动飞船 想要移动飞船,先要明白飞船位置变化的本质是什么。 通过上一篇文章࿰…...
export在linux中的作用
在某些项目中常常使用export命令。该命令的作用是设置环境变量,并且该环境变量为当前shell进程与其启动的子进程共享。 export MODEL_NAME"stable-diffusion-v1-4"比如以上命令,如果不采用export,设置的变量仅在当前shell命令/进程…...
FFmpeg解复用器如何从封装格式中解析出不同的音视频数据
目录 1、ffmpeg介绍 2、FFMPEG的目录结构 3、FFmpeg的格式封装与分离 3.1、数据结构 3.2、封装和分离(muxer和demuxer) 3.2.1、Demuxer流程 3.2.2、Muxer流程 4、总结 4.1、播放器 4.2、转码器 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续…...
测试-常见问题
目录 1、测试报告中有哪些内容? 2、如何保证用例的覆盖度 3、测试用例和测试脚本的关系 4、Android和iOS测试的区别 5、小程序和App测试的区别 6、Web和App测试的区别 7、Alpha和Beta测试的区别 8、测试计划包括哪些? 9、Jmeter 、 monkey 10、设计用例的考虑点 …...
RSA非对称加密算法(Java实现)
废话不多说,直接上代码 public class RSAService {private static final String RSA "RSA";private static final String PUBLIC_KEY "xxx";private static final String PRIVATE_KEY "xxx";public static void main(String[] ar…...
netty构建http服务器
Netty 是一个高性能的异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。要使用 Netty 搭建一个支持 HTTP 方法(GET, POST, PUT, DELETE)的 HTTP 服务器,可以按照以下步骤进行操作。 准备工作 添加依赖…...
Dropout、DropConnect、Standout...12种正则化变种,到底该用哪个?一份给炼丹师的避坑指南
Dropout变种全景指南:从理论到实战的12种策略深度解析 当你的神经网络在验证集上表现不佳时,第一个跳入脑海的解决方案是什么?对于大多数从业者来说,Dropout无疑是正则化工具箱中的首选武器。但你是否知道,标准Dropout…...
如何让键盘听懂你的设备语言?设备条件判断打造智能多设备键盘映射方案
如何让键盘听懂你的设备语言?设备条件判断打造智能多设备键盘映射方案 【免费下载链接】Karabiner-Elements Karabiner-Elements is a powerful utility for keyboard customization on macOS Sierra (10.12) or later. 项目地址: https://gitcode.com/gh_mirrors…...
WeKnora镜像免配置教程:支持知识库版本管理与灰度问答切换机制
WeKnora镜像免配置教程:支持知识库版本管理与灰度问答切换机制 1. 引言:告别AI幻觉,让知识问答精准可控 你有没有遇到过这种情况?你给AI看了一份产品说明书,然后问它一个具体参数,结果它回答得头头是道&a…...
基于MATLAB的小波变换在碰磨故障信号特征提取中的应用
2-23 基于matlab的小波变换碰磨故障信号的特征提取 基于matlab的小波变换碰磨故障信号的特征提取,可以画出信号原图,轴心轨迹,频谱图以及多层小波变换的重构信号。 程序已调通,可直接运行。最近在搞旋转机械碰磨故障诊断ÿ…...
RVC与VITS技术对比:检索式vs端到端语音转换的适用场景分析
RVC与VITS技术对比:检索式vs端到端语音转换的适用场景分析 1. 引言 你有没有想过,为什么有些AI翻唱听起来特别像原唱,而有些则感觉“味儿”不太对?或者,为什么有些语音转换工具训练起来飞快,但效果时好时…...
机器人状态估计——从IMU运动方程到ESKF误差状态建模(上)
1. 从IMU数据到机器人状态估计的挑战 当你第一次拿到一个IMU传感器时,可能会觉得它就像个魔法黑盒——只要把它装在机器人上,就能知道机器人的姿态、速度和位置。但实际操作起来,你会发现IMU数据就像个调皮的孩子,稍不注意就会给你…...
使用PyInstaller打包yz-女生-角色扮演-造相Z-Turbo模型为可执行文件
使用PyInstaller打包yz-女生-角色扮演-造相Z-Turbo模型为可执行文件 1. 引言 想象一下,你开发了一个很酷的AI应用,基于yz-女生-角色扮演-造相Z-Turbo模型,可以生成精美的二次元角色图片。现在你想分享给朋友或用户使用,但他们可…...
构建自主海上防御系统:Mirai Robotics融资420万美元
Mirai Robotics已筹集420万美元的Pre-Seed轮资金,旨在构建自主和智能的海上系统。本轮融资由Primo Ventures、Techshop和40Jemz Ventures领投,并有来自意大利和国际的天使投资人参与。 海洋是地球上最关键的基础设施之一。全球超过80%的贸易通过海路运输…...
Realistic Vision V5.1显存占用对比:启用offload前后VRAM峰值下降62%实测
Realistic Vision V5.1显存占用对比:启用offload前后VRAM峰值下降62%实测 1. 项目背景与技术特点 Realistic Vision V5.1是目前Stable Diffusion 1.5生态中最顶级的写实风格模型之一,能够生成媲美专业单反相机拍摄的人像作品。然而在实际使用中&#x…...
告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库
告别官方驱动:深入解读ES7210寄存器,打造你自己的ESP32音频采集库 在嵌入式音频开发领域,ES7210作为一款高性能多通道麦克风ADC芯片,因其出色的信噪比和灵活的配置选项,成为ESP32平台上音频采集的热门选择。然而&#…...
