Lua面向对象编程
面向对象的三个基本特征
Lua中的面向对象Lua中的表和对象有很多相似性,因此在Lua中可以使用表来实现面向对象。 zhangsan = {name = ""} function zhangsan.setName(self,name) self.name = name end zhangsan.setName(zhangsan,"张三") print(zhangsan.name) --输出: --张三 类(Class)上面的例子中,zhangsan对象拥有了属性和方法,但是这个对象却不是通过类来创建的。在大多数面向对象的语言中都提供了类的概念,类在对象创建中扮演了模板的作用。 Person = {} function Person.setName(self,name) self.name = name end function Person:new(person) person = person or {} self.__index = self setmetatable(person,self) return person end zhangsan = 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方法。 function Male:setName(name) self.name = "Male:"..name end zhangsan = Male:new() zhangsan:setName("张三") print(zhangsan.name) --输出: --Male:张三 这是由于,在Male中已经有setName方法了,所以解释器不会再去Person中去查找。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |