Lua中类的实现

 更新时间:2015年04月10日 09:51:18   投稿:hebedich  
Lua中没有类的概念,但我们可以利用Lua本身的语言特性来实现类。 下文将详细的解释在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)) 

以上所述就是本文的全部内容了,希望能够对大家熟练掌握lua脚本有所帮助。

相关文章

  • Lua协程(coroutine)程序运行分析

    Lua协程(coroutine)程序运行分析

    这篇文章主要介绍了Lua协程(coroutine)程序运行分析,本文讲解分析了一段lua 协程代码是如何运行的,需要的朋友可以参考下
    2015-05-05
  • Lua获取文件长度和判断文件是否存在函数分享

    Lua获取文件长度和判断文件是否存在函数分享

    这篇文章主要介绍了Lua获取文件长度和判断文件是否存在函数分享,需要的朋友可以参考下
    2015-04-04
  • Lua中__index和__newindex之间的沉默与合作

    Lua中__index和__newindex之间的沉默与合作

    这篇文章主要介绍了Lua中__index和__newindex之间的沉默与合作,本文着重讲解了__index和__newindex之间的联系,需要的朋友可以参考下
    2014-09-09
  • Lua中的函数知识总结

    Lua中的函数知识总结

    这篇文章主要介绍了Lua中的函数知识总结,本文讲解了函数的一些基础知识、多重返回值问题、变长参数、内嵌函数等内容,需要的朋友可以参考下
    2014-09-09
  • Lua中类的实现

    Lua中类的实现

    Lua中没有类的概念,但我们可以利用Lua本身的语言特性来实现类。 下文将详细的解释在Lua中实现类的原理
    2015-04-04
  • Lua中实现面向对象的一种漂亮解决方案

    Lua中实现面向对象的一种漂亮解决方案

    这篇文章主要介绍了Lua中实现面向对象的一种漂亮解决方案,本文给出实现代码、使用方法及代码分析,需要的朋友可以参考下
    2015-01-01
  • Lua中的迭代器(iterator)浅析

    Lua中的迭代器(iterator)浅析

    这篇文章主要介绍了Lua中的迭代器(iterator)浅析,本文讲解了pairs迭代器和、ipairs迭代器,同时提及了io.lines、string.gmatch、迭代器与Closure(闭包)等内容,需要的朋友可以参考下
    2014-09-09
  • Lua的table库函数insert、remove、concat、sort详细介绍

    Lua的table库函数insert、remove、concat、sort详细介绍

    这篇文章主要介绍了Lua的table库函数insert、remove、concat、sort详细介绍,本文分别给出了这几个函数的使用实例,需要的朋友可以参考下
    2015-04-04
  • LUA中的闭包(closure)浅析

    LUA中的闭包(closure)浅析

    这篇文章主要介绍了LUA中的闭包(closure)浅析,本文给出实例讲解LUA中的闭包,需要的朋友可以参考下
    2015-02-02
  • Lua极简入门指南(六):模块

    Lua极简入门指南(六):模块

    这篇文章主要介绍了Lua极简入门指南(六):模块,本文讲解了require函数、编写模块、查找模块等内容,需要的朋友可以参考下
    2014-10-10

最新评论