Lua 语法 面向对象实现

封装

-- 面向对象 类 其实都是基于 table来实现
-- 元表相关的知识点
Object = {}
Object.id=12

function Object:Test()
	print(self.id)
end


-- 冒号 是会自动将调用这个函数的对象 作为第一个参数传入的写法
-- 在Object 表添加 new 成员方法
function Object:new()
	--self 代表的是 我们默认传入的第一个参数

	--对象就是变量 返回一个新的变量
	--返回出去的内容 本质上就是表对象

	local  obj={}
	-- 元表知识 __index 当找自己的变量 找不到时 就会去找元表当中__index指向的内容
	self.__index=self
	setmetatable(obj,self)
	
	return obj
end

local myObj = Object:new();

print(myObj)
myObj.id=3

-- 输出 3
print(myObj.id)
myObj:Test()

--输出12
print(Object.id)

--输出 12
print(getmetatable(myObj).id)

继承

--C# clase 类名 : 继承类
-- 写一个用于继承的方法
function Object:subClass(className)
	--body
	_G[className] ={}
	-- 写相关继承的规则
	-- 用到元表
	local obj=_G[className]
	self.__index=self;

	--子类定义一个base 属性代表父类
	obj.base=self;

	setmetatable(obj,self)
end

--print(_G)
--_G["a"]=1
--_G.b="洛溪"
--print(a)
--print(b)

Object:subClass("Person")
print(Object.id)

-- 上面继承用到的方法
local  p1=Person:new()
p1.id=3
print(p1.id)


Object:subClass("Monster")
local  m1=Monster:new()
m1.id=6
print(m1.id)

多态

--C# clase 类名 : 继承类
-- 写一个用于继承的方法
function Object:subClass(className)
	--body
	_G[className] ={}
	-- 写相关继承的规则
	-- 用到元表
	local obj=_G[className]
	self.__index=self;

	--子类定义一个base 属性代表父类
	obj.base=self;

	setmetatable(obj,self)
end

--print(_G)
--_G["a"]=1
--_G.b="洛溪"
--print(a)
--print(b)

Object:subClass("Person")
print(Object.id)

local  p1=Person:new()
p1.id=3
print(p1.id)


Object:subClass("Monster")
local  m1=Monster:new()
m1.id=6
print(m1.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,self.posY)		
end


GameObject:subClass("Player")

function Player:Move()
	--base 指的是 GameObject 表(类)
	-- 这种方式调用 相当于是把基类表 作为第一个参数传入了方法中

	--避免把基类表 传入到方法中 这样相当于就是公用一张表的属性了
	-- 我们如果要执行父类逻辑 我们不要直接使用冒号调用
	-- 要通过点. 调用 然后把直接传入第一个参数

	self.base.Move(self)
	-- body
	
	-- 多态目前这种写法 有坑 不同的对象使用的成员变量 居然时同样的成员变量
	-- 不是自己的 所有不要用下面的写法在重写方法里
	--self.base:Move()
end


local p1 = Player:new();

p1:Move();

local p2=Player:new();

p2:Move()

Player:Move()
Player:Move()
posted @   BaiLuoXi  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示