码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-06 20:22:36      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

面向对象最基本的就是两点:类,对象。

但是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

然后定义个函数吧.

1 function class:ctor()
2     self.data=1
3 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添加成员。

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

标签:

原文地址:http://www.cnblogs.com/magicsea/p/4277752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!