lua实现面向对象(封装/继承/多态)

lua实现面向对象封装/继承/多态

  • lua实现面向对象(封装/继承/多态)

lua实现面向对象(封装/继承/多态)

print("***********面向对象**********")
print("*************封装************")
--表就是表现类的一种形式
--实现了new方法:本质上是创建一个空表,__index,元表
--如果子表寻找某元素时在自身找不到时,会去元表的__index中寻找
--修改创建出来的对象的属性变量时: 为这个空表对象新建一个成员属性
--冒号:自动将调用这个函数的对象作为第一个参数传入。self代表函数调用者
Object={}
Object.id=1function Object:Test()print(self.id)
end
--冒号 自动将调用这个函数的对象 作为第一个参数传入 
function Object:new()--self表示默认传入第一个参数--对象就是变量 返回一个新的变量--返回的内容 本质上就是表变量local obj={}self.__index=selfsetmetatable(obj,self)return obj
endlocal myObj=Object:new()
local myObj2=Object:new()--对空表中 声明一个新的属性 叫做id
myObj.id=3
myObj:Test()myObj2.id=2
myObj2:Test()print("*************继承************")
--写一个继承的方法(_G,元表,__index)
function Object:subClass(classname)--_G是总表 所有声明的全局变量(以键值对存储)--在_G表中注册_G[classname]={}--相关继承的规则(元表)local obj=_G[classname]--设置Object的__index表为Objectself.__index=self--给子类定义一个属性base base属性代表父类obj.base=self--设置classname的元表为Objectsetmetatable(obj,self)
end
--创建类(Person)
--调用Person类的new方法
--实际上调用的是Person元表(Object)中的new方法
--new 方法中将调用者的__index设置为调用者
--并返回一个将调用者视为元表的表对象
--该表对象如果没找到元素会在元表__index(此时调用者为它的元表,且调用者的__index是它本身)里面找
Object:subClass("Person")
local p1=Person:new()
print(p1.id)
print("修改值为100")
p1.id=100
print(p1.id)Object:subClass("Monster")
local m1=Monster:new()
print(m1.id)
print("修改值为200")
m1.id=200
print(m1.id)
print("*************多态************")
--相同行为 不同表现 就是多态
--相同方法 不同执行逻辑 就是多态
--相同方法名 子类有不同的处理逻辑
--直接重写方法
--如果想要保留父类逻辑执行
--加入自定义属性base
--在subclass方法中赋值
--坑点:通过base调用父类方法时候,如果改变属性一定不要使用:,而是通过.将自己传入第一个参数进入父类函数
Object:subClass("GameObject")
GameObject.posX=0
GameObject.posY=0
--GameObject 定义move方法
function GameObject:Move()--赋值会新建变量--查询不到会找元表的__index表(self->player->gameobject)self.posX=self.posX+1self.posY=self.posY+1print(self.posX)print(self.posY)
endGameObject:subClass("Player")--多态 相同方法 不同执行逻辑
--相同行为 不同表现
function Player:Move()--调用Player父类(GameObject/Object)的方法--传递自己的参数self(而不是base)self.base.Move(self)
endlocal b=Player:new()b.posX=3 
b:Move()-- local b1=Player:new()
-- b1.posX=3 
-- b1:Move()

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

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

相关文章

使用__attribute__((at(addr))) 固定变量到指定 Flash 地址

文章目录 一、代码示例:将变量固定到 Flash 0x08001000二、__attribute__((at(addr))) 的作用三、__attribute__((at(addr))) 可能导致的问题四、运行时修改 Flash 存储的变量五、在 GCC(STM32CubeIDE)中实现同样功能 在嵌入式开发中&#xf…

vmware虚拟机快照、克隆、迁移区别说明

一、快照 1.1 快照概念 记录了虚拟机在某个特定时间点的状态(软件部署、网络配置、照片备份、游戏存档等) 1.2快照用途 可以在需要时轻松地恢复虚拟机到快照创建时的状态。 备份和恢复:快速备份虚拟机状态的方法可以在数据丢失或损坏时快速恢复虚拟机到先前的状态。测试和…

面试常问系列(一)-神经网络参数初始化

一、背景 说到参数初始化,先提一下大家常见的两个概念梯度消失和梯度爆炸。 (一)、梯度消失:深层网络的“静默杀手” 定义: 在反向传播过程中,梯度值随着网络层数增加呈指数级衰减,最终趋近…

使用CSS3实现炫酷的3D翻转卡片效果

使用CSS3实现炫酷的3D翻转卡片效果 这里写目录标题 使用CSS3实现炫酷的3D翻转卡片效果项目介绍技术要点分析1. 3D空间设置2. 核心CSS属性3. 布局和定位 实现难点和解决方案1. 3D效果的流畅性2. 卡片内容布局3. 响应式设计 性能优化建议浏览器兼容性总结 项目介绍 在这个项目中…

AI Agent开发大全第七课-个人如何申请到靠谱的AI

前言 前面几个课程我们做了一些AI基础知识的铺垫,不要小看基础知识,这些基础知识往往是一些正在从事AI开发的工作者们都没有深入去了解的。 其实这就好比简历上写熟练使用mySql,而实际mySql里那些精妙的参数和设置以及一些底层真的都知道吗? 所以我特别强调基础得打造,…

什么是网络准入?十种常见的网络准入解决方案分享!

在数字化转型的浪潮中,企业网络的边界日益模糊,数据安全与访问控制成为了企业IT管理的核心挑战之一。OneNAC网络准入系统,作为新一代网络安全解决方案的佼佼者,凭借其强大的功能特性和灵活性,在众多网络准入控制&#…

Jetpack Compose 选项卡控件实现

这里写目录标题 介绍主体解释 介绍 实现选项卡控件 主体 import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.…

Java 大视界 -- Java 大数据在智慧文旅旅游目的地营销与品牌传播中的应用(150)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

使用密码连接Redis服务的两种方式

说明:本文介绍连接需要密码的Redis服务的两种方式 方式一 连接时,携带密码,如下: redis-cli -a [密码]如下: 有两个问题: 密码直接放在命令里,可通过 history 找到,不安全&#x…

搭建React简单项目

一、项目构建 目录结构: 安装脚手架 npm install -g create-react-app // or yarn add -g create-react-app 一、项目版本 1、react:"^18.3.1"; 2、react-router-dom:"^6.23.1"; 3、项目创…

知识库已上线

目录 知识库上线了加入知识库注册账号切换租户加入租户找到知识库点击申请等待管理员审核通过后,点击去后台可以开始创作了创建我们的第一个知识库点击详情进入创作页面,创建我们的第一篇知识 发布知识将我们的知识库变更为公开状态发布知识等待管理员审…

对象克隆以及BigInteger()方法,与BigDecima()方法的学习

BigInteger()方法: ①获取一个随机的大整数: public class Test3 {public static void main(String[] args) {Random rnew Random();BigInteger bigIntegernew BigInteger(4,r);System.out.println(bigInteger);} } ②&#xf…

学习记录-vue2,3-vue实现tab栏

目录 vue实现tab栏功能描述实现效果vue实现tab栏实现步骤1. 概念理解2. Tab栏切换 完整实例代码 vue实现tab栏功能描述 选项卡切换选中状态 实现效果 vue实现tab栏实现步骤 1. 概念理解 了解vue的基础指令 代码含义v-on绑定事件,可以简写为:事件名“执行体”。…

【读书笔记】华为《从偶然到必然》

note 华为的成功并非偶然,而是通过IPD体系、投资组合管理、平台战略等系统性工具,将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念,揭示了企业规模扩张与管理能力匹配的深层规律,为高科技企业提供了可借鉴…

表达式树和编译原理【10道经典面试题】(中英对照)

表达式树(Expression Tree) 是一种用于表示数学表达式的二叉树结构。它在编译器设计、数学计算引擎、符号计算等领域有着广泛的应用(《表达式树(Expression Tree)在编译器中的应用》)。理解表达式树的构建、…

【redis】主从复制:单点问题、配置详解、特点详解

文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中,涉及到一个非常关键的问题:单点问题 某个服务器程序&…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

STM32定时器-01定时器概述

内容概述 定时器是STM32中功能最强大、结构最复杂的一个外设&#xff0c;分为四部分&#xff1a; 一部分&#xff1a;定时中断功能 二部分&#xff1a;定时器输出比较&#xff0c;常见的用途&#xff1a;产生PWM波形&#xff0c;驱动电机&#xff08;如驱动舵机和直流电机&…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker&#xff1a;在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…