Lua⭐️面向对象——属性、函数方法、类、继承

在这里插入图片描述 

目录

🟥面向对象初步实现

1️⃣ 方法1

2️⃣ 方法2,最常用方法

🟧 构造函数,实现C#类声明新对象效果

1️⃣ 用法1

2️⃣ 用法2

🟨继承


 

🟥面向对象初步实现

--面向对象:对于一个对象来说,属性、方法
--人

--属性
person={name="skode",age="99"}

--方法1
person.eat=function()
	print(person.name.."在吃饭")
end
person.eat()

--方法2
function person.eat()
	print(person.name.."在吃饭")
end
person.eat()

--[[
方法3
person={name="skode",age="99",eat=function()
	print(person.name.."在吃饭")}
person.eat()
--]]






>lua -e "io.stdout:setvbuf 'no'" "lua.lua" 
skode在吃饭
skode在吃饭
>Exit code: 0

 

1️⃣ 方法1

但此时有一个问题,即每次有新name时,都要重新定义person,形成person1、person2等等,非常不方便

person={name="skode",age="99"}
person.eat=function()
	print(person.name.."在吃饭")
end

person.eat()

a=person
person=nil
a.eat()



--现运行报出错误,原因是当person=nil后,eat方法中无法调用person表,导致失败。我们可改为如下所示,完成操作

>lua -e "io.stdout:setvbuf 'no'" "newlua.lua" 
skode在吃饭
lua: newlua.lua:4: attempt to index global 'person' (a nil value)
stack traceback:
	newlua.lua:4: in function 'eat'
	newlua.lua:11: in main chunk
	[C]: ?
>Exit code: 1

修改后代码,类似形参实参

person={name="skode",age="99"}
person.eat=function(self)
	print(self.name.."在吃饭")
end

person.eat(person)

a=person
person=nil
a.eat(a)





>lua -e "io.stdout:setvbuf 'no'" "newlua.lua" 
skode在吃饭
skode在吃饭
>Exit code: 0

 

2️⃣ 方法2,最常用方法

person={name="skode",age="99"}
function person:eat()
	print(self.name.."在吃饭")
end

--当用冒号时,不必写参数,系统自动传递表给函数。self代表了当前调用eat函数的表
person:eat()

a=person
--person=nil
a:eat()
--当前仍可通过点来调用,不过需要手动给self赋值
a.eat(a)




>lua -e "io.stdout:setvbuf 'no'" "newlua.lua" 
skode在吃饭
skode在吃饭
skode在吃饭
>Exit code: 0

🟧 构造函数,实现C#类声明新对象效果

1️⃣ 用法1

该效果即是:先定义一个表,该表下文称为旧表。通过构造函数,让新表拥有旧表的所有数据。那怎样实现该过程的呢,是通过元表功能

当调用该表时,先从该表搜索是否有key,没有再从元表修改;

当写入跟元表相同内容时,新数据时直接写到新表中去的,并不会对元表造成影响,这时输出时也是输出的新表内容

person={name="skode",age="99"}

--对person声明新的new方法
function person:new()
	local t={}    --新表   local是为避免在外界造成不必要影响
	setmetatable(t,{__index=self})	--为新表赋值元表,self指定person为元表
	return t
end

person1=person:new()
person2=person:new()

print(person1.name)

person1.name="chengzi"
print(person1.name)




>lua -e "io.stdout:setvbuf 'no'" "newlua.lua" 
skode
chengzi
>Exit code: 0

2️⃣ 用法2

person={name="skode",age="99"}

--对person声明新的new方法
function person:new(o)
	local t=o or {}    --新表
	setmetatable(t,{__index=self})	--为新表赋值元表,self指定person为元表
	return t
end

person1=person:new({weight=100})
person2=person:new()

print(person1.name)

person1.name="chengzi"
print(person1.weight)





>lua -e "io.stdout:setvbuf 'no'" "newlua.lua" 
skode
100
>Exit code: 0

🟨继承

person={name="skode",age="99"}

--对person声明新的new方法
function person:new(o)
	t=o or {}    --新表
	setmetatable(t,{__index=self})	--为新表赋值元表,self指定person为元表
	return t
end

student=person:new()
student.grade=1

stu1=student:new()

print(stu1.name)





>lua -e "io.stdout:setvbuf 'no'" "newlua.lua" 
skode
>Exit code: 0

 

 

大家还有什么问题,欢迎在下方留言!


 

在这里插入图片描述


如果你有 技术的问题 或 项目开发

都可以加下方联系方式

和我聊一聊你的故事🧡

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值