首页 > 其他分享 >Lua 语法 面向对象实现

Lua 语法 面向对象实现

时间:2024-07-28 21:31:21浏览次数:7  
标签:面向对象 -- self Object 语法 Lua print local id

封装

-- 面向对象 类 其实都是基于 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()

标签:面向对象,--,self,Object,语法,Lua,print,local,id
From: https://www.cnblogs.com/Luo-Xi/p/18328889

相关文章

  • 面向对象编程(2)——封装
    目录一、概念1.1主要特点1.2实例二、封装的内容2.1 属性(数据成员)2.2 方法(成员函数)2.3 实现细节2.4 类的依赖关系2.5示例2.5.1示例2.5.2解释三、原则与注意事项3.1 封装的原则3.2注意事项一、概念        封装(Encapsulation)是面向对象编程......
  • Lua 语法 自带库
    时间相关--系统时间print(os.time())--自己传入参数得到时间print(os.time({year=2014,month=8,day=14}))--os.date("*t")localnowTime=os.date("*t")fork,vinpairs(nowTime)do print(k,v)end数学运算--math--绝对值print(math.abs(-11))--弧度转角......
  • Lua 语法 元表
    元表概念--任何表变量都可以作为另一个表变量的元表--任何表变量都可以有自己的元表(继承(浅拷贝))--当我们子表中进行一些特定操作时--会执行元表中的内容设置元表设置元表的公共方法setmetatable(被设置的表,元表)getmetatable得到元表,判断是否有元表meta={}myTa......
  • Lua 语法 协同程序
    协程的创建lua协程的类型是thread(线程)协程的本质是一个线程对象关键字:coroutine.create--创建协程fun=function()print(123)end--第一种协程创建方式co=coroutine.create(fun)--协程的本质是一个线程对象--输出类型:地址print(co)--输出threadprint(ty......
  • Android.mk语法规则(主要针对C编译)
    参考页面:https://www.jb51.net/program/29533325i.htmhttps://www.cnblogs.com/kn-zheng/p/17005182.htmlAndroid.mk是什么Android.mk是Android工程管理文件,类似于编译文件的说明书,用来向NDK编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。And......
  • 模块3 面向对象编程高级 --- 第十一章:异常处理
    第十一章异常处理主要知识点1、异常产生的原因2、标准异常类3、Java的异常处理机制4、异常的创建5、异常的抛出6、异常语句的编程学习目标熟悉异常产生的原因和标准异常类的用法。能够运用异常处理机制编写Java程序,提高安全性;11.1异常的......
  • 面向对象的设计原则
    之前谈DDD时提及过当下很多标榜面向对象的语言,却是以面向过程来实现的问题。这里就从编码设计的角度来顺一下面向对象设计的一些思维。其实就像我正在梳理的设计模式一样,都是些老生常谈的东西,可是往往在实践的时候,这些老生常谈的东西会被“反刍”,总会有种常看常新的感觉。面向......
  • Lua 语法 复杂类型表 字典 , 类,结构体,表的公共操作
    字典字典的本质运用键值对一个键对应一个值和自定义索引表相似定义使用--字典是由键值对构成a={["name"]="洛溪",["age"]=14,["1"]=10}--访问单个变量用中括号填键来访问print(a["name"])print(a["1"])print(a["age"])--还可以类似成员变量的形式得......
  • lua可变参数
    遍历可变参数localfunctionTest1(...)localargCnt=select("#",...)fori=1,argCntdolocalitem=select(i,...)print(i,item)endendTest1(4,5,6) 遍历可变参数方式2localfunctionTest2(...)localargs={...}......
  • 当 Visual Studio 检测到代码没有问题时,无法弄清楚为什么它返回“语法错误”
    fromkivy.appimportAppfromkivy.uix.gridlayoutimportGridLayoutfromkivy.uix.labelimportLabelclasstest(App):defbuild(self):self.window=GridLayout()self.label=Label(text="hello")self.window.add_widge......