• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua中实现面向对象的一种漂亮解决方案

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

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了lua 面向对象,lua如何实现面向对象,lua面向对象编程,lua 对象,lua面对对象等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在 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
</div>

现在,我们来看看怎么使用:
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
</div>
以上是基本的 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
</div>
现在可以试一下了:
a=test.new(1) -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello() -- 输出 hello test ,这个函数被重载了。
</div>

在这个方案中,只定义了一个函数 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
</div>
以上是基本的 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
</div>
现在可以试一下了:
a=test.new(1)   -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello()   -- 输出 hello test ,这个函数被重载了。
</div>
其实,实现多重继承也并不复杂,这里就不再展开了。更有意义的扩展可能是增加一个 dtor :)

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

</div>

您可能想查找下面的文章:

  • 深入解读Lua中迭代器与泛型for的使用
  • Lua中函数与面向对象编程的基础知识整理
  • Lua教程(十三):弱引用table
  • Lua面向对象编程之类的简单实现方式
  • Lua模拟面向对象示例分享
  • Lua中实现面向对象的一种漂亮解决方案
  • Lua中让回调函数支持回调对象方法的解决方法
  • Lua 极简入门指南(七):面向对象编程
  • Lua中的面向对象编程详解

相关文章

  • Lua编程示例(八):生产者-消费者问题
  • 实现Lua中数据类型的源码分享
  • Lua实现类继承
  • Lua入门学习笔记
  • Lua中的迭代器和泛型for实例
  • lua中操作json数据的方法
  • Lua中关于元方法的一些知识点小结
  • Lua教程(二):C++和Lua相互传递数据示例
  • Lua多行注释和取消多行注释的方法
  • openresty中使用lua-nginx创建socket实例

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua简介、编译安装教程及变量等语法介绍
    • Lua面向对象之类和继承浅析
    • Lua中的loadfile、dofile、loadstring、require用法实例
    • Ruby类实例变量、类实例方法和类变量、类方法的区别
    • Lua中的loadfile、dofile、require详解
    • Lua学习笔记之数据类型
    • Lua学习笔记之表达式
    • Cocos2d-x中调用Lua及HelloWorld.lua源码分解
    • Lua中的for循环和迭代器的秘密探究
    • Lua教程(四):函数详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有