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

 更新时间:2015年01月12日 08:54:02   投稿:junjie  
这篇文章主要介绍了Lua中实现面向对象的一种漂亮解决方案,本文给出实现代码、使用方法及代码分析,需要的朋友可以参考下

在 pil 中,lua 的作者推荐了一种方案来实现 OO,比较简洁,但是我依然觉得有些繁琐。

这里给出一种更漂亮一点的解决方案,见下文:

这里提供 Lua 中实现 OO 的一种方案:

复制代码 代码如下:

local _class={}
 
function class(super)
 local class_type={}
 class_type.ctor=false
 class_type.super=super
 class_type.new=function(...)
   local obj={}
   do
    local create
    create = function(c,...)
     if c.super then
      create(c.super,...)
     end
     if c.ctor then
      c.ctor(obj,...)
     end
    end
 
    create(class_type,...)
   end
   setmetatable(obj,{ __index=_class[class_type] })
   return obj
  end
 local vtbl={}
 _class[class_type]=vtbl
 
 setmetatable(class_type,{__newindex=
  function(t,k,v)
   vtbl[k]=v
  end
 })
 
 if super then
  setmetatable(vtbl,{__index=
   function(t,k)
    local ret=_class[super][k]
    vtbl[k]=ret
    return ret
   end
  })
 end
 
 return class_type
end

现在,我们来看看怎么使用:
base_type=class()  -- 定义一个基类 base_type

复制代码 代码如下:

function base_type:ctor(x) -- 定义 base_type 的构造函数
 print("base_type ctor")
 self.x=x
end
 
function base_type:print_x() -- 定义一个成员函数 base_type:print_x
 print(self.x)
end
 
function base_type:hello() -- 定义另一个成员函数 base_type:hello
 print("hello base_type")
end

以上是基本的 class 定义的语法,完全兼容 lua 的编程习惯。我增加了一个叫做 ctor 的词,作为构造函数的名字。
下面看看怎样继承:
复制代码 代码如下:

test=class(base_type) -- 定义一个类 test 继承于 base_type
 
function test:ctor() -- 定义 test 的构造函数
 print("test ctor")
end
 
function test:hello() -- 重载 base_type:hello 为 test:hello
 print("hello test")
end

现在可以试一下了:
复制代码 代码如下:

a=test.new(1) -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello() -- 输出 hello test ,这个函数被重载了。

在这个方案中,只定义了一个函数 class(super) ,用这个函数,我们就可以方便的在 lua 中定义类:

复制代码 代码如下:

base_type=class()       -- 定义一个基类 base_type

function base_type:ctor(x)  -- 定义 base_type 的构造函数
    print("base_type ctor")
    self.x=x
end

function base_type:print_x()    -- 定义一个成员函数 base_type:print_x
    print(self.x)
end

function base_type:hello()  -- 定义另一个成员函数 base_type:hello
    print("hello base_type")
end


以上是基本的 class 定义的语法,完全兼容 lua 的编程习惯。我增加了一个叫做 ctor 的词,作为构造函数的名字。

下面看看怎样继承: test=class(basetype) -- 定义一个类 test 继承于 basetype

复制代码 代码如下:

function test:ctor()    -- 定义 test 的构造函数
    print("test ctor")
end

function test:hello()   -- 重载 base_type:hello 为 test:hello
    print("hello test")
end


现在可以试一下了:
复制代码 代码如下:

a=test.new(1)   -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello()   -- 输出 hello test ,这个函数被重载了。

其实,实现多重继承也并不复杂,这里就不再展开了。更有意义的扩展可能是增加一个 dtor :)

ps. 这里用了点小技巧,将 self 绑定到 closure 上,所以并不使用 a:hello 而是直接用 a.hello 调用成员函数。这个技巧并不非常有用,从效率角度上说,还是不用为好。

相关文章

  • Lua学习笔记之函数、变长参数、closure(闭包)、select等

    Lua学习笔记之函数、变长参数、closure(闭包)、select等

    这篇文章主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下
    2015-04-04
  • 浅谈Lua语句

    浅谈Lua语句

    Lua支持大多数传统的语句,跟C语言和Pascal差不多。传统的语句包括:赋值,控制结构,流程调用等。Lua还支持一些不太传统的语句,例如多赋值(听起来有点怪,往下看就明白了)和局部变量声明(这个好像也是传统的吧)。
    2015-05-05
  • Lua教程(五):迭代器和泛型for

    Lua教程(五):迭代器和泛型for

    这篇文章主要介绍了Lua教程(五):迭代器和泛型for,本文讲解了迭代器与Closure、泛型for的语义、 无状态迭代器的例子、 具有复杂状态的迭代器等内容,需要的朋友可以参考下
    2015-04-04
  • Lua教程(十九):C调用Lua

    Lua教程(十九):C调用Lua

    这篇文章主要介绍了Lua教程(十九):C调用Lua,本文讲解了C调用Lua基础知识、table操作、调用Lua函数等内容,需要的朋友可以参考下
    2015-04-04
  • 使用Lua作为C语言项目的配置文件实例

    使用Lua作为C语言项目的配置文件实例

    这篇文章主要介绍了使用Lua作为C语言项目的配置文件实例,本文用Lua创建了一个配置文件,然后在C言语中解析它,需要的朋友可以参考下
    2015-04-04
  • Lua脚本调用外部脚本

    Lua脚本调用外部脚本

    在游戏脚本开发中,我们往往会发现脚本量非常大,而且我们经常会在一些核心脚本文件中定义常用的功能函数,但是Lua脚本没有提供include关键词,那又是怎样调用外部函数的呢?如何实现脚本的Include功能?
    2014-09-09
  • 举例说明Lua中元表和元方法的使用

    举例说明Lua中元表和元方法的使用

    这篇文章主要介绍了举例说明Lua中元表和元方法的使用,文中--两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]],需要的朋友可以参考下
    2015-07-07
  • Lua读取和写入文件处理例子

    Lua读取和写入文件处理例子

    这篇文章主要介绍了Lua读取和写入文件处理,本文直接给出实例代码,需要的朋友可以参考下
    2014-11-11
  • Lua教程(十): 全局变量和非全局的环境

    Lua教程(十): 全局变量和非全局的环境

    这篇文章主要介绍了Lua教程(十): 全局变量和非全局的环境,本文讲解了老的全局变量环境和Lua5中新的非全局环境相关知识,需要的朋友可以参考下
    2015-04-04
  • 在Lua中使用模块的基础教程

    在Lua中使用模块的基础教程

    这篇文章主要介绍了在Lua中模块的基本使用方法,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05

最新评论