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

Lua中类的实现

时间:2015-03-28 21:53:43      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:lua      原型   元表   对象   

    概述

     一个类就是像是一个创建对象的模具,对于Lua这种没有类的概念的语言,为了模拟类,方法是为要创建的对象制定一个原型(prototype。这个原型相当于其他语言中的类。但是原型同时也是一种常规的对象,当其他的对象(看成是原型的实例)遇到一个未知的操作时,就会去原型中查找。因此,在Lua这种没有类的语言中,为了表示一个类,只需创建一个专用作其他对象的原型。类和原型都是一种组织对象间共享行为的方式。本文将在Lua中模拟类,相关的代码可以在我的github上直接运行。

 实现

 Lua中要模拟类比较关键的地方就是class的继承机制,以及class实例化的过程,这个过程的主要是用了元表技术以及是否把方法拷贝到子类或实例中(若拷贝,则增加了数据冗余,并且丧失了父类更新子类也会自动更新的特性,若不拷贝,则每次访问父类方法,由于使用元表,都会代码额外的开销),下面是一种实现方法:

clsObject = {
__ClassType = "class type"
}
                                                                                                       
function clsObject:Inherit(o)   
    o = o or {}
o.__ClassType = "class type"
    o.mt = { __index = o}
    setmetatable(o, {__index = self})
    return o
end

function clsObject:New(...)
    local o = {}

    setmetatable(o, self.mt)

    if o.__init__ then
        o:__init__(...)
    end 
    return o
end

function clsObject:__init__()
end

function clsObject:Destroy()
end

function clsObject:GetType()
    return "BaseClass"
end

上面,不管在继承机制还是实例化的过程,都是使用了元表技术,这样做符合class继承的思想。另外还上面的实现,还可以实现工具函数:获取一个class的父类和判断一个class是否是子类或是对象是否改类的实例,代码如下:

function Super(TmpClass)
    return getmetatable(TmpClass).__index
end

function IsSub(clsSub, clsAncestor)
    local Temp = clsSub
    while  1 do
        local mt = getmetatable(Temp)
        if mt then
            Temp = mt.__index
            if Temp == clsAncestor then
                return true
            end 
        else
            return false
        end 
    end 
end

可以按下面实例代码来使用这个类

clsParent = clsObject:Inherit()

function clsParent:Foo()
    print("ParentFoo!")
end

local ParentObj = clsParent:New()
ParentObj:Foo()


clsSon = clsParent:Inherit()
function clsSon:Foo()
    Super(clsSon).Foo(self)
    print("SonFoo")
end

local SonObj = clsSon:Inherit()
SonObj:Foo()

print(IsSub(clsSon, clsParent))
print(IsSub(clsSon, clsObject))

参考资料

http://blog.codingnow.com/2006/06/oo_lua.html

《Lua程序设计》(第二版)

Lua中类的实现

标签:lua      原型   元表   对象   

原文地址:http://blog.csdn.net/maximuszhou/article/details/44705627

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