博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua(十七)——面向对象
阅读量:1984 次
发布时间:2019-04-27

本文共 1127 字,大约阅读时间需要 3 分钟。

Lua并不是一个支持面向对象的语言,没有类的概念,但是可以间接地去实现面向对象的功能

对象是由属性+方法组成,Lua中最基本的结构是table,我们可以用table来描述对象的属性,function函数用来表示方法,所以Lua中的面向对象是通过table+function模拟出来的

一:实现Lua中类的概念

下面是Lua模拟出的面向对象的例子:

对象由属于和方法组成(下面的person表中有属性有方法)

 

但是这样存在一些问题!!!!!

————第一个问题:
Lua中的表是一个引用类型,将person表赋值给a相当于person与a引用了同一块内存空间,因为内存空间的销毁是当它的所有引用都销毁时才会被销毁,所以当把person销毁时,正常情况下应该仍然可以通过a访问到内存空间中的数据,但是会报错,因为调用的函数中使用了person.name,而person已经销毁访问不到person.name,所以会报错
我们可以这样解决:在函数中传递一个参数
以上的方法还是比较麻烦,每次都需要将自身表当作参数传入函数中,Lua提供了另外一种方法(函数)的定义方式:
使用冒号来定义函数,我们可以在函数内部使用self,self代表调用者,当使用person:eat()时调用者就是person,当使用a:eat()时调用者就是a,同样的,当调用方法时,也需要用冒号去调用,self会自动赋值参数,如果用点去调用则需要手动赋值参数
简单来说就是当通过冒号调用方法时,系统会自动赋值调用者,当通过点调用方法时,需要手动赋值调用者
使用冒号的方式定义函数不能定义为匿名函数

 

——第二个问题:
定义不同的person时我们需要重新定义每个person中的属性和方法
在Lua中实现类的概念,需要先定义好一个原型,也就是一个模板
之后用元方法__index去实现Lua中的类
完整代码:当将Person:new()赋值给person1时,person1就是返回值t,当输出person1.name时,会先从t表中找,发现没有,则从__index对应的模板表Person中找,person1和person2是两个不同的表,并不是引用同一块内存空间

第二种带参数的写法:可以在创建对象时传入一个现有的对象(表),这样我们就可以在原型模板的基础上加入了现有的对象(表)


二:实现Lua中的继承

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

创建Teacher和Student时,它们的元表都是Person,之后创建student1,student2和teacher1时,它们的元表是Student和Teacher

转载地址:http://vtyvf.baihongyu.com/

你可能感兴趣的文章
golang fmt包中的占位符
查看>>
对Redis Cluster的理解
查看>>
The MASM32 SDK version 10 发布了!
查看>>
发布软件:TreeInfo(分层信息管理器)
查看>>
c++点的距离
查看>>
c++实现彩色炫酷(?)画面
查看>>
c++马拦过河卒
查看>>
2019NOIP D4题 加工领奖
查看>>
1997年世界黑客大赛获奖作品
查看>>
论DEV-C++怎样才能做窗口
查看>>
Failed to connect to github.com port 443: Operation timed out和弹出无法打开"GoogleSoftwareUpdate.bundle"
查看>>
2021.5.19 JS高级第二天
查看>>
2021.5.20 JS高级第三天
查看>>
2021.5.21 Jquery
查看>>
2021.5.25 JSON
查看>>
2021.5.28 AJAX
查看>>
正则表达式
查看>>
离散数学-图论
查看>>
啊沙发沙发
查看>>
SpringBoot内置Tomcat配置参数
查看>>