?最近做的一个项目用到了Lua,所以也顺便学习了些,想必玩过魔兽的朋友都听说过lua,不过相对来说用这个的还是不多。
? 面向对象只是一种思想,在Lua我们也可以实现,减少了冗余代码。
? 先建一个类 person
? person={
??? name="a",
??? age = 23,
??? high=177,
??? weight=65
}
?
在pserson表里,我们定义了一个人所具有的所有属性,当然我们还可以有动作(方法),比如人给人加一个说话的动作,可以这样写:
?? functiuon person:say()
????? print(self.name.."我来了,哈哈")
?? end
或者
? person.say= function(self)
? print(self.name.."我来了,哈哈")
? end
上边的两方法可以说是一样的只是命名方法不一样而已,相当于都是表person增加个说话的方法,唯一不同的是,可以看书,两个方法一个要带参数,一个不用,在这就运用到了Lua的语法糖语法 “:”,这个“:”相当于你在调用方法的时候把self自己给传进去了,比如:
调用 person:say()? 和person.say(person)
? >>输出?? a我来了,哈哈
相信对于这个语法大家已经明白了,我们继续继承
?
?
现在person的原型已经出来了,既然是面向对象,我们就要得有初始的构造方法啊,ok,下面我们就先写个person的构造方法
?
先看代码:
?
? function person:new(o)
??? --private 成员区域
??? o = o or {}
??? setmetatable(o,self)
??? self.__index = self
??? return o
end
?
ok构造方法完成,在这里需要解释下 元表的意思了,lua中任何一张表都有其元表,一组相关的表可以共享一个元表(也就是说可以共享元表的属性了),默认的是创建一个不带元表的表。在这里我们使用setmetatable(o,self),(lua的方法setmetatable)这个方法的意思就是,表o的元表是self,self? -前面说过,就是谁调用new()self就是谁,在这里就是person,我们理一下,在这个方法里:o是一个传进来的表table,他的元表是person,如此只要你给这个方法传一个值(最好是一个表table),我们都会给你返回一个以person为元表的table表了,如此一来,你只要new一下我们都会造一个person对象了
?
?
?
当然,我们还想要继承,我们怎样做:
给person加一个方法,
person.extend=person.new
呵呵,简单吧,其实就是person的new()方法我们变个名字而已,比如:
C=person:extend()
就代笔C继承了person,拥有了person所拥有的属性,
你可以试试:
C:say()
>>输出:a我来了,哈哈
?
当然我们还可以扩展子类C自己的属性和方法,我们只需
C=person:extend({hand="two",go=function() print(self.name.."__gpgpgp") end})
调用C:go()
>>输出:a__gpgpgp
调用print(C.name)
>>输出:a
?