您的位置:首页 > 编程语言 > Lua

lua面向对象学习随笔 --类与实例

2015-02-06 18:08 211 查看
面向对象最基本的就是两点:类,对象。

但是lua是无类型的,要实现面向对象只能模拟实现。

其实他们都是表,多了个__index属性,就模拟出了实现“类和继承”的效果。

面对Lua千万别用c++的类来类比,不然会误入歧途!

它就是一个table而已下面一个典型的定义一个“类”的方式。

class={}
function class:new(o)
local o=o or {}
setmetatable(o,self)
self.__index=self
o:ctor()
return o
end


第一行,因为是个表当然要定义下表结构。

第二行,这里等于function class.new(class,o),self==class。这样写是方面后面继承。

第三行,定义或者获取外部一个o表,这个才是我们模拟的所谓“对象”的实体。

第四,五行,一起看 setmetatable(o,self) self.__index=self,就是让class成为o表的元表,index也是class,这样o里没有的就找class表读取。不懂可以找找__index相关知识。

最后,o:ctor() 模拟构造函数,然后返回这个o

然后定义个函数吧.

function class:ctor()
self.data=1
end


这里class:ctor()等于class.ctor(self)  ,self==class,说是表class.data=1。虽然看起来像是一个类的方法定义,但其实只是一个表的元素赋值。
但是只是现在目前self是class表,后面可能不同了。

然后我们执行
a=class:new()
就创建出了一个a对象。这个对象里面目前没有c++对象的函数表,也没有成员。就是一个空表,挂了一个metatable成员。
这句代码分解开就是


function class:new()
local o= {}
setmetatable(o,class)
class.__index=class
o:ctor()
--因为o是空表,所以只能去元表里找ctor这个函数,所以执行的效果如下面代码
return o
end

function class.ctor(o)
o.data=1
end


现在a={data=1,metatable=class},于是对象就实例化出来了。

有个成员data,但是函数还是在class中,调用函数就到class里找,不同的就是那个self==o,于是看起来这就是个对象了。

以此类推,给class添加函数就是给o“添加函数”,ctor里self增加成员就是给o添加成员。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: