当前位置: 首页 > article >正文

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)
	-- body
	print(self.id)
end
Object.id=1
function Object:new()--[[new 函数是一个构造函数,用于创建 Object 类的新实例。
	这里创建了一个空表 obj,并设置其元表的 __index 为 self(即 Object),
	这样 obj 就可以访问 Object 中定义的属性和方法。最后返回这个新对象。]]
	local obj={}
	self.__index=self
	setmetatable(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=self
	obj.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+1
	self.posY=self.posY+1
	print(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.kler.cn/a/378674.html

相关文章:

  • 《C++最新标准下字符串字面量类型的深度剖析》
  • RHCSA课后练习3(网络与磁盘)
  • Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性
  • 手游和应用出海资讯:可灵AI独立APP即将上架;Rollic在英国推出芭比合并解谜手游
  • 「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础
  • 如何在 Ubuntu 上安装和配置 GitLab
  • NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储
  • spark-本地模式的配置和简单使用
  • 【Unity】鼠标点击获取世界坐标位置:物体移动至鼠标点击的位置
  • 设计模式讲解01-建造者模式(Builder)
  • ZDS 数字股票 布局全球视野,开启智能金融新篇章
  • 秒杀优化(异步秒杀,基于redis-stream实现消息队列)
  • node.js rc4加密/解密 不好用怎么办?
  • 中文分词模拟器
  • 双十一晚会停办,一个消费时代结束了
  • 鸿蒙网络编程系列43-仓颉版HttpRequest下载文件示例
  • 第02章 MySQL环境搭建
  • 无人机反步滑膜控制算法!
  • 谷歌浏览器报“喔唷,崩溃啦!”怎么办?
  • 五层塔灯——智能仓储的守护者
  • 数组相关操作的java实现
  • TH-OCR 文字识别:开启高效数字化时代
  • 【JavaEE】【网络原理】初识网络
  • 理解SQL中通配符的使用
  • WPF+MVVM案例实战(十三)- 封装一个自定义消息弹窗控件(上)
  • leetcode 3259.超级饮料的最大强化能量