面向对象特征
- 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()
如果你不进行设置,其创建的对象都是调用元表内的东西(属性和函数)
那我们要进行设置如下操作
直接对对象进行赋值就行了,对元表不会产生任何影响