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脚本有所帮助。

(0)

相关推荐

  • Lua中类的实现原理探讨(Lua中实现类的方法)

    Lua中没有类的概念,但我们可以利用Lua本身的语言特性来实现类. 下文将详细的解释在Lua中实现类的原理,涉及到的细节点将拆分出来讲,相信对Lua中实现类的理解有困难的同学将会释疑. 类是什么? 想要实现类,就要知道类到底是什么. 在我看来,类,就是一个自己定义的变量类型.它约定了一些它的属性和方法,是属性和方法的一个集合. 所有的方法都需要一个名字,即使是匿名函数实际上也有个名字.这就形成了方法名和方法函数的键值映射关系,即方法名为键,映射的值为方法函数. 比如说有一个类是人,人有一个说话的

  • Lua实现类继承

    mulInherit.lua 复制代码 代码如下: --[[ author:looyer@sina.com date:2014/7/18 purpose:lua的继承演示 --]] --- base class "Object" local Object = {_t = "Object"} function Object:new(id)     local o =     {         _id = id     }     setmetatable(o, se

  • Lua中类的实现

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

  • Lua中的面向对象编程详解

    简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 复制代码 代码如下: local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 print(tb1.a) 上述代码会输

  • Lua中设置table为只读属性的方法详解

    项目中部分只读表易被人误改写,故决定在非线上环境里对这些表附加只读属性,方便在出现误改写的时候抛出lua错误,最终版代码如下: --[[------------------------------------------------------------------------------ -** 设置table只读 出现改写会抛出lua error -- 用法 local cfg_proxy = read_only(cfg) retur cfg_proxy -- 增加了防重置设置read_o

  • Nginx+lua 实现调用.so文件

    最近在和智能硬件部门一起,做一个室内定位的服务,该服务根据手机端传过来的beacon设备列表,根据一定的算法计算出具体的商场,并将商场ID和beason设备列表作为参数,调用.so文件中的计算方法,得出位置数据(坐标:x.y.z),返回给手机端. 因为服务对QPS要求比较高,并且都是纯查询操作,于是决定使用Nginx+lua+Redis的架构(该架构在公司内部已成主流,比较成熟).下面我将对lua调用.so文件的方式,做一下介绍. lua调用.so文件,主要有两种方式: 1.Lua直接调用动态链

  • linux系统安装Nginx Lua环境

    亦可参考官方安装指南: lua-nginx-module Installation 这是我总结的安装,供参考: 需要最新版的Nginx,LuaJIT,ngx_devel_kit,lua-nginx-module等安装文件: Nginx LuaJIT Lua或者LuaJIT都是可以的,但是出于性能的考虑,推荐安装LuaJIT ngx_devel_kit lua-nginx-module 参考命令下载: $ curl -O http://nginx.org/download/nginx-1.10.1

  • Lua中string.lower()使用指南

    前言 今天我们总结的函数也比较简单,函数的作用的将所给字符串的中的大写字母转换成小写字母,这种操作往往出现在比较操作之前,比如验证码通常都是不区分大小写的,接下来我们一起看一下函数的用法. 内容 string.lower() 原型:string.lower(s) 解释:接收一个字符串,然后返回一个将字符串中大写字母转化为小写字母的字符串副本,除此之外其他字符都不会被改变,大写字母的定义依赖于当前的本地设置. Usage 首先我们新建一个文件将文件命名为lowertest.lua然后编写代码如下:

  • Lua中string.len()使用指南

    前言 今天是星期天,我还是不浪费大家的脑细胞了,直接来列举一个string家族中比较简单的函数,函数虽然简单,但是用处却很大,使用频率也很高,废话不多说,我们直接来看函数用法. 内容 string.len() 原型:string.len(s) 解释:返回所给字符串的长度,如果字符串中包含'\0',也会被统计为一个字符. Usage 首先新建一个文件将文件命名为lentest.lua然后编写如下代码: -- 一个常规字符串 local sourcestr = "This is a rainy da

  • 使用Lua编写Web端模板引擎的实例代码分享

    ltemplate.lua local insert = table.insert local remove = table.remove local concat = table.concat local format = string.format local loaded = {} local partten = "(.-){#([^#].-[^#])#}()" local content = {} local cur_content = nil local function o

  • Lua中基本的数据类型、表达式与流程控制语句讲解

    1. Lua类型 1.1 基本类型 Lua是一种动态类型语言,没有类型定义的语法.Lua一共有8种基础类型:nil(空).boolean(布尔).number(数字).string(字符串).userdata(自定义类型).function(函数).thread(线程).table(表). 函数type可根据一个值返回其类型名称(字符串),如print(type(print)),输出"function":print(type(type(X))) ,输出"string"

随机推荐