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程序设计》(第二版)

时间: 2024-10-05 12:44:00

Lua中类的实现的相关文章

Cocos2d-x 脚本语言Lua中的面向对象

Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义.但相同在Lua中能够利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 --Lua中的面向对象 --[[ 复制表方式面向对象 參数为一张表.通过遍历这张表取值,赋给一张空表,最后返回新建的表.来达到克隆表 ]] function clone(tab) local ins =

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

lua 类, 继承, 面向对象再次理解

本文转载于:http://blog.csdn.net/teng_ontheway/article/details/38900211 1.lua中的类 lua中其实是没有类的,有的只是表(table),而类之间的继承也就是将父类的表连到了一起,派生类中没有找到的属性和方法就通过元表查找父类 2.lua中类的属性 classA = {width =10, height=10} classA={} classA.width=10 classA.height=10 两种方法都可以,通过点self.wid

【cocos2d-x3.2游戏开发】 lua 类, 继承, 面向对象

1.lua中的类 lua中其实是没有类的,有的只是表(table),而类之间的继承也就是将父类的表连到了一起,派生类中没有找到的属性和方法就通过元表查找父类 2.lua中类的属性 classA = {width =10, height=10} classA={} classA.width=10 classA.height=10 两种方法都可以,通过点self.width统一调用 3.类方法 function Box:collsion() -- 默认第一个参数隐藏传递self,可以通过self.x

Lua学习笔记4:类及集成的实现

-- Lua中类的实现 -------------------------------- 基类 ---------------------------- classBase = {x = 0,y = 0} -- x,y为类的成员变量 classBase.__index = classBase -- 这句是重定义元表的索引,必须要有 --模拟构造体,一般名称为new() function classBase:new(x,y) local self = {}     -- 初始化对象自身 setme

CC3.2+Lua(3) ——Lua之class

[唠叨] 在使用Lua的时候,cocos2d-x为我们提供了一个 class(classname, super) 这个函数. 它可以让我们很方便的定义一个类,或者继承cocos2d-x的某个类. PS:class()是cocos2d-x为我们封装的函数,本身Lua没有这个函数. [class] class函数是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定义的. -- Create an class.

[转]Lua中的面向对象实现方法

面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程.在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

Lua中面向对象编程的理解

模块 模块是一个独立的空间,一个独立的环境,访问模块成员需要先require,并使用"模块名.成员名称"的格式访问.注意:模块是一个table. 类 在lua中所有对象都是一个table,类也是一个table,但类应该是一个只读的table,类的定义是通过创建一个模块实现的. lua代码: module("Student",package.seeall) function study(self) end 在调用module方法时添加package.seeall参数的

lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)

lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现. 首先,一般来说一个表和它的元表是不同的个体(不属于同一个表),在创建新的表时,不会自动创建元表. setmetatable函数:设置元表 setmetatable( 表1 , 表2 )  将表2挂接为表1的元表,并且返回经过挂接后的表1