Lua 面向对象--封装

面向对象特征

  • 1、 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
  • 2、继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
  • 3、多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
  • 4、抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。

Lua 中面向对象

Lua本身不支持面向对象

对象由属性和方法组成。LUA中最基本的结构是table,所以需要用table来描述对象的属性。

lua 中的 function 可以用来表示方法。那么LUA中的类可以通过 table + function 模拟出来。

至于继承,可以通过 metetable 模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。

Lua 中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。

实现简单的一个lua面向对象

t={a='name'}
t1 = t
t1.a='name2'
print(t.a)--因为t跟t1都是指向同一个table,所以修改t1等同于修改t里面的值

--实现一个简单面向对象
--封装
 -- 在lua中复杂数据结构都是使用表来表现的
 -- 面向对象 类 也是基于table表现
 --新建一个对象
 --对于一个对象来说,有属性、方法
 --方法1
 -- person = {name='lin',age=18}
 -- person.eat = function()
 -- 	print(person.name..' eat')
 -- end

 --方法2
 -- person = {
 -- 	name = 'lin',
 -- 	age = 18,
 -- 	eat = function()
 -- 		print(person.name..' eat')
 -- 	end
 -- }

 --方法三
 person = {
 	name = 'lin',
 	age = 18, 	
 }

 function person.eat()
 	print(person.name..' eat')
end

person.eat()

在这里插入图片描述

冒号和点调用函数的使用区别

我们如果将person置空,然后输出调用person的a,直接报错,因为person nil
在这里插入图片描述
我们可以采用self,self表示它自身
运行可以打印了
在这里插入图片描述 这种方式也是比较麻烦的
每次都要传个参数过去
试下下面方法

  person = {
 	name = 'lin',
 	age = 18
 }

 --下面这两方法结果是一样的
 function person.eat(self)
 	print(self.name..' eat')
 end

 function person:eat()
 	print(self.name..' eat')
 end

person.eat(person)
person:eat()

在这里插入图片描述

通过冒号:我们就不用再定义self也不用在传递self,它会自动赋值
通过点调用,它不会自动赋值,你要给它赋值一个表(就是当前的table)

批量创建对象

	--批量创建对象
	--这是两张不同的表,但person1\person2的__index指向的是同一张元表
	person1 = person:new()
	person2 = person:new()
	print(person1.name)
	print(person2.name)
	person1:play()

在这里插入图片描述
如果你不进行设置,其创建的对象都是调用元表内的东西(属性和函数)
那我们要进行设置如下操作
在这里插入图片描述
直接对对象进行赋值就行了,对元表不会产生任何影响

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值