Lua的面向对象实现
【不知道为什么,lua没有语法高亮提示】 我的前提条件: 1.Linux下已安装lua5.2 2.已安装sublimetext,并配置好lua的编译。 配置如下: 依次找到:Tools -> Build System -> New Build System {??? ?"cmd":???? ?["/usr/bin/lua5.2","$file"],???? ?"file_regex":"^(?:lua:)?[t](...*?):([0-9]*):?([0-9]*)",???? ????"selector":???? ????"source.lua"???? } ?? 其中 "/usr/bin/lua5.2"?是lua编译器的路径。 可以换成"lua",前提是已经配置好lua的环境。 并在Tools -> Build System 下选中 lua。 以后编译的时候,直接按ctrl+B 就ok了。 1.复制的方式 我们知道lua中非常重要的一个结构是表,那么我们的面向对象也应该是由表来实现。 既然是复制的方式,那么肯定会有复制的函数: function?clone(tab) ????--?body ????local?self?=?{} ????for?k,v?in?pairs(tab)?do ????????self[k]?=?v ????end ????return?self end 这个函数的功能就是将tab中的内容复制到self中,并返回。 首先我们定义一个类,叫做Man Man?=?{} Man.sayHi?=?function() ????print("hi...") end local?m?=?clone(Man) m.sayHi() 这样,结合clone函数,我们的local m就可以看作是Man的实例,调用sayHi方法就可以执行了,ctrl+B执行一下。 紧接着我们来写一个有参赛的成员函数: Man.talk?=?function?(ins) ????print("i?said?"..ins.content) end 参数 ins 我们可以认为是一个类的实例,那么我们需要一个构造方法来传入初始的内容,这样做: Man.new?=?function(content) ????--?body ????local?self?=?clone(Man) ????self.content?=?content ????return?self end 这样,在调用Man.new()函数的时候,就附加了content属性。 因此我们的调用就成了: local?man?=?Man.new("eat?it?!") man:talk() 注意:man:talk() 跟 man.talk(man)是一个意思。使用 : 会默认将man这个实例当作第一个参数传递进去。 再运行一下,会输出 i said eat it ! 面向对象肯定会有继承,那么既然是复制的方式,那就会有一个复制方法,将2个类合成一个。 既子类拥有自己的特有属性,也有父类的属性。 function?copy(to,from) ????--?body ????for?k,v?in?pairs(from)?do ????????to[k]?=?v ????end end 将from里的东西都复制到to里面去,很简单。 那么接下来定义子类: Boy?=?{} Boy.new?=?function(content) ????--?body ????local?man?=?Man.new(content) ????copy(man,Boy) ????man.name?=?"jobs" ????return?man end Boy.sayName?=?function?(self) ????--?body ????print("my?name?is?"..self.name) end 在这里继承了Man并且附加了name属性。测试: local?b?=?Boy.new("hehe?...") b:sayHi() b:sayName() b:talk() 会输出: hi... 假如要重写函数: Boy.sayHi?=?function?() ????print("Boy?say?hi?...?"?) end 那么就会输出: Boy say hi ... 2.函数闭包方式 这里的函数闭包,简单来说,就是一个函数的声明和实现,在另一个函数之内。 现在来实现一个类: function?People(name) ????--?body ????local?self?=?{} ????function?init() ????????self.name?=?name ????end ????self.talk?=?function() ????????print("people?talk?"..self.name) ????end ????init() ????return?self end local?p?=?People("steven") p.talk() 那么,输出就是 people talk steven 现在来实现一个子类: function?Man(name) ???? ????local?self?=?People(name) ????self.talk?=?function() ????????print("man?talk?"?..?self.name) ????end ????self.eat?=?function() ????????print("eating?...?") ????end ????return?self end local?m?=?Man("jack") m:talk() m:eat() 在Man中,talk复写了父类的方法,那么将会输出: man talk jack eating ... 函数闭包的方式要比复制的方式消耗资源大一些,但是就现在来说,微不足道。 推荐使用函数闭包的方式来编写程序。 暂时到此。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |