
Lua中的表和对象有很多相似性,因此在Lua中可以使用表来实现面向对象。
Lua中类的方法可以通过表+function来模拟:
zhangsan = {name = ""}function zhangsan.setname(self,name) self.name = nameendzhangsan.setname(zhangsan,"张三")print(zhangsan.name)--输出:--张三 上面的例子中,zhangsan对象拥有了属性和方法,但是这个对象却不是通过类来创建的。在大多数面向对象的语言中都提供了类的概念,类在对象创建中扮演了模板的作用。
在Lua中,我们可以使用原型的思想来模拟类。让每一个对象都有一个原型,当对象遇到未知的 *** 作时就在原型中去查找。
如下,为zhangsan指定它的原型Person:
Person = {}function Person.setname(self,name) self.name = nameendfunction Person:new(person) person = person or {} self.__index = self setMetatable(person,self) return personendzhangsan = Person:new()print(zhangsan.name)zhangsan:setname("张三")print(zhangsan.name)--输出:--nil--张三 在上面的代码中,使用了冒号:来 *** 作,如Person:new(person)这样的写法相当于Person.new(Person,person),冒号只是一个语法糖,这个函数中的self即为Person类本身。
在类(Class)的new *** 作中,self.__index = self,将Person的元方法__index指向了自身,这样做会导致当调用一个方法时,解释器第一时间将会查找Person自身有没有这个方法。这一点和继承很相似。
在继承中,子类可以拥有父类的属性和方法,也可以定义自己的属性和方法。
如果要从一个类中派生一个子类,可以先创建一个从基类继承了所有 *** 作的空类:
Male = Person:new()Male.sex = "男"zhangsan = Male:new()zhangsan:setname("张三")print(zhangsan.name,zhangsan.sex)--输出:--张三 男 Male拥有了Person的new方法,同时通过Male创建的zhangsan拥有Person的setname方法。
在这个过程中,Male = Person:new()会将Male的元表设置为Person,zhangsan = Male:new()则将zhangsan的元表设置为了Male。
当调用zhangsan:setname时,Lua将首先从zhangsan查找setname方法,发现不存在时,则从zhangsan元表Male的元方法__index中(即Male本身)查找,直到在Person中找到该方法。因此,zhangsan不仅有Male的sex属性,还拥有Person的setname方法。
同时,还可以很方便地在Male中重写Person的setname方法,只需要定义一个新方法即可。
function Male:setname(name) self.name = "Male:"..nameendzhangsan = Male:new()zhangsan:setname("张三")print(zhangsan.name)--输出:--Male:张三 这是由于,在Male中已经有setname方法了,所以解释器不会再去Person中去查找。
总结以上是内存溢出为你收集整理的Lua面向对象编程全部内容,希望文章能够帮你解决Lua面向对象编程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)