面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程。在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承。
一、复制表的方式面向对象
- --Lua中的面向对象
- --[[
- 复制表方式面向对象
- 参数为一张表,通过遍历这张表取值,赋给一张空表,最后返回新建的表,来达到克隆表
- ]]
- functionclone(tab)
- localins={}
- forkey,varinpairs(tab)do
- ins[key]=var
- end
- returnins
- 复制表
- 第一参数是目标表,第二个参数是需要复制的表
- 通过遍历tab来取值将它赋值到目标表中
- ]]
- functioncopy(dist,tab)
- dist[key]= end
- --定义一张空表,相当于一个类
- People={}
- --functionPeople.sayHi()
- --print("Peoplesayhi")
- --end
- --定义类中的方法sayHi,传入一个self参数
- People.sayHi=function(self)
- print("Peoplesayhi:"..self.name)
- --定义一个new方法,传进一个name参数,通过克隆People这张表来生成一个对象
- --相当于类当中的一个构造方法
- People.new=function(name)
- localself=clone(People)
- self.name=name
- returnself
- --localp=clone(People)
- --p.sayHi()
- --生成一个新的对象
- localp=People.new("ZhangSan")
- --p.sayHi(p)
- --p:sayHi()
- --定义一张空表,也代表一个类
- Man={}
- --Man中的构造方法,实现Lua中类的继承
- Man. localself=People.new(name)
- --附加Man中所有的键值对到People中的实例中去
- copy(self,Man)
- Man.sayHello=function()
- print("Mansayhello")
- --重写父类People中的sayHi方法
- Man.sayHi= print("MansayHi"..self.name)
- --创建Man的一个实例
- localm=Man.new("Lisi")
- m:sayHi()
以上代码已经有详细的注释,读者需要仔细阅读这里所给出的例子。
二、使用函数闭包的形式实现面向对象
- --以函数闭包的形式实现面向对象
- --定义一个方法,函数闭包实现一个类的概念
- functionPeople(name)
- localself={}
- --初始化方法,私有的
- localfunctioninit()
- self.name=name
- self.sayHi=function()
- print("Hello"..self.name)
- --调用初始化
- init()
- --实例化一个对象
- localp=People("ZhangSan")
- p:sayHi()
- --函数闭包的形式实现类继承
- functionMan(name)
- localself=People(name)
- --localfunctioninit()
- --
- self.sayHello= print("Hi"..self.name)
- returnself
- localm=Man("Lisi")
- --m:sayHello()
- m:sayHi()