目录
🟥面向对象初步实现
--面向对象:对于一个对象来说,属性、方法
--人
--属性
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
大家还有什么问题,欢迎在下方留言!
如果你有 技术的问题 或 项目开发
都可以加下方联系方式
和我聊一聊你的故事🧡