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

server/2025/3/28 8:46:45/

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

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

lua_1">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.ppmy.cn/server/176723.html

相关文章

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理,欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图: 注意,下面谈及的所有方式,都要求两者的IP地址处于同一网段,涉及到的软件资源见felm。 一、Windows主…

游戏引擎学习第168天

回顾并计划今天的内容 今天我们将进行一些思考工作,回顾一下之前的工作。我们已经在资产处理工具中提取了字体,并展示了如何使用该库。我们有两个版本,一个不使用任何库,适合想要完全不依赖库的用户; 我们今天的任务…

密码学(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念:离散对数是密码学中一个重要的数学问题,特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说,给定一个群 G G G和一个生成元 …

Github 2025-03-19 C开源项目日报 Top4

根据Github Trendings的统计,今日(2025-03-19统计)共有4个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目4Valkey: 一个高性能数据结构服务器 创建周期:8 天开发语言:C协议类型:BSD 3-Clause “New” or “Revised” LicenseStar数量:2775 个…

xpath轴

前言 宝子们,今天咱就来唠唠自动化测试里 Web 自动化测试这档子事儿,重点说说元素定位方法中的 XPath,它在这领域里那可是相当 “炸裂” 的存在! 就说和那些传统的定位方法相比吧,普通的通过 ID 或 name 定位&#xff…

基于springboot的房产销售系统(016)

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产销售系统,它彻底改变了过去传统的…

vscode+wsl2+bear+clangd配置教程

要在Windows下使用VS Code连接WSL 2中的Linux源码并实现Clangd功能,可按以下步骤操作: 1. 确保WSL 2和Linux发行版已安装并运行 wsl2安装教程参考网上资料,比较容易就能装好。 你可以通过Windows应用商店安装所需的Linux发行版&#xff0c…

深度测评|杰和科技云终端VT813详细介绍+实测数据!

传统企业办公标配为一人一台电脑,每个人的操作系统、应用程序以及内部数据都绑定于一台设备上,若其中一个环节出现问题,电脑桌面将无法正常使用; 在政府服务窗口、行政审批中心等场景中,硬件故障、系统崩溃或数据丢失等…