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

版权声明:欢迎转载,转载请注明出处 https://blog.csdn.net/weixin_38239050/article/details/82584613

面向对象初步实现

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

--属性
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

但此时有一个问题,即每次有新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,最常用方法

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

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

当调用该表时,先从该表搜索是否有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

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

猜你喜欢

转载自blog.csdn.net/weixin_38239050/article/details/82584613
今日推荐