Lua(十七)——面向对象

一:Lua中的面向对象

Lua并不是一个支持面向对象的语言,没有类的概念,但是可以间接地去实现面向对象的功能。
对象是由属性+方法组成,Lua中最基本的结构是table,我们可以用table来描述对象的属性,function函数用来表示方法,所以Lua中的面向对象是通过table+function模拟出来的。

1.实现Lua中的类概念

下面是模拟出的面向对象的例子:person表中有属性有方法

但是这样存在一些问题:
——第一个问题:Lua中的表是一个引用类型,将person表赋值给a相当于person与a引用了同一块内存空间,因为内存空间的销毁是当它的所有引用都销毁时才会被销毁,所以当把person销毁时,正常情况下应该仍然可以通过a访问到内存空间中的数据,但是会报错,因为打印函数中使用了person.name,person已经销毁了,所以会报错。

我们可以这样解决:在函数中传递一个参数:

以上的方法还是比较麻烦,每次都需要将自身表当作参数传入函数中,Lua提供了另外一种函数的定义方式:
当使用冒号的方式定义函数时,我们可以在函数内部使用self,self代表调用者,当使用person:eat()时调用者就是person,当使用a:eat()时调用者就是a,同样的,当调用方法时,也需要用冒号去调用,self会自动赋值参数,如果用点去调用则需要手动赋值参数。
使用冒号的方式定义函数不能使用匿名函数

——第二个问题:定义不同的person时我们需要重新定义每个person中的属性和方法:

在Lua中实现类的概念,需要先定义好一个原型,也就是一个模板。

之后用元表去实现Lua中的类:

完整代码:

第二种带参数的写法:


2.实现Lua中的继承

例如在一个学校中,有老师和学生,他们有一些共同的属性和方法,各自又有不同的属性,这就需要利用继承来实现:

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/89151725