`
石头的日记
  • 浏览: 198925 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

在Lua中实现继承

阅读更多

 最近做的一个项目用到了Lua,所以也顺便学习了些,想必玩过魔兽的朋友都听说过lua,不过相对来说用这个的还是不多。

  面向对象只是一种思想,在Lua我们也可以实现,减少了冗余代码。

  先建一个类 person

  person={

    name="a",

    age = 23,

    high=177,

    weight=65

}

 

在pserson表里,我们定义了一个人所具有的所有属性,当然我们还可以有动作(方法),比如人给人加一个说话的动作,可以这样写:

   functiuon person:say()

      print(self.name.."我来了,哈哈")

   end

或者

  person.say= function(self)

  print(self.name.."我来了,哈哈")

  end

上边的两方法可以说是一样的只是命名方法不一样而已,相当于都是表person增加个说话的方法,唯一不同的是,可以看书,两个方法一个要带参数,一个不用,在这就运用到了Lua的语法糖语法 “:”,这个“:”相当于你在调用方法的时候把self自己给传进去了,比如:

调用 person:say()  和person.say(person)

  >>输出   a我来了,哈哈

相信对于这个语法大家已经明白了,我们继续继承

 

 

现在person的原型已经出来了,既然是面向对象,我们就要得有初始的构造方法啊,ok,下面我们就先写个person的构造方法

 

先看代码:

 

  function person:new(o)
    --private 成员区域
    o = o or {}
    setmetatable(o,self)
    self.__index = self
    return o
end

 

ok构造方法完成,在这里需要解释下 元表的意思了,lua中任何一张表都有其元表,一组相关的表可以共享一个元表(也就是说可以共享元表的属性了),默认的是创建一个不带元表的表。在这里我们使用setmetatable(o,self),(lua的方法setmetatable)这个方法的意思就是,表o的元表是self,self  -前面说过,就是谁调用new()self就是谁,在这里就是person,我们理一下,在这个方法里:o是一个传进来的表table,他的元表是person,如此只要你给这个方法传一个值(最好是一个表table),我们都会给你返回一个以person为元表的table表了,如此一来,你只要new一下我们都会造一个person对象了

 

 

 

当然,我们还想要继承,我们怎样做:

给person加一个方法,

person.extend=person.new

呵呵,简单吧,其实就是person的new()方法我们变个名字而已,比如:

C=person:extend()

就代笔C继承了person,拥有了person所拥有的属性,

你可以试试:

C:say()

>>输出:a我来了,哈哈

 

当然我们还可以扩展子类C自己的属性和方法,我们只需

C=person:extend({hand="two",go=function() print(self.name.."__gpgpgp") end})

调用C:go()

>>输出:a__gpgpgp

调用print(C.name)

>>输出:a

 

1
0
分享到:
评论

相关推荐

    lua语言实现类的原理

    lua类的实现

    Lua实现类继承

    里给大家演示的是一个使用lua实现类继承的示例,实现类继承其实有很多种写法,这里是本人常用的方法,推荐给大家。

    lua面向对象实现

    Lua实现OOP,可以继承,覆盖,sample里面实现了简单的lua类定义,并封装了简单的事件驱动机制

    Lua 单例的实现

    Lua中没有类的概念,但是程序猿说要面向对象,然后就有类。程序猿说要继承 和override,然后就有了继承 和 override 。程序猿说要有单例然后有了单例 这里用 Person 和 Student 来作为例子。有少许解释在代码中。

    teaEntityInLua:Lua 中的继承和基本函数式编程库

    茶实体InLua Lua 中的继承和基本函数式编程库。

    lua类封装方法

    在lua中实现类,以及继承的方法,包括了一些例子

    Lua中文教程(pdf版)

    27.3 在C函数中保存状态.................207 第28章 User-Defined Types in C........212 28.1 Userdata.................212 28.2 Metatables..............215 28.3 访问面向对象的数据...............217 ...

    Cpp2Lua 导出c++到lua

    导出c++类、函数、变量等到lua的实现代码,提供思路。类似luabind、tolua++,部分特性如继承导出等暂未实现。

    Lua 入门教程

    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 是巴西里约热内卢天主教大学(Pontifical Catholic ...

    一个简单的Lua与C++中间层

    自己实现的一个Lua与C++中间层。支持Ruby风格的面向对象。以及Lua内部和C++内部对象的继承。

    LuaBind 源码 (Lua增强库)

    能力支持函数式的定义一个Lua类,而且使之继承自C++或者Lua. Lua类可以覆写从 C++ 基类 继承来的虚函数. 她的目标平台是Lua 5.0 ,不能支持Lua 4.0 . 她利用模板原编程技术实现.这意味着,你不需要额外的预处理过程去...

    Cs2Lua:CSharp代码转lua,适用于使用lua实现热更新而又想有一个强类型检查的语言的场合

    适用于使用lua实现热更新而又想有一个强类型检查的语言的场合【示例链接】【用法】【设计与实现原理】【最新进展】【2021-02-26】 对象模型调整,实现层基于class来定位方法(避免元表按继承层次查找,编译时绑定,...

    lua 程序设计学习.doc 版

    27.3 在C函数中保存状态 27.3.1 The Registry 27.3.2 References 27.3.3 Upvalues 第28章 User-Defined Types in C 28.1 Userdata 28.2 Metatables 28.3 访问面向对象的数据 28.4 访问数组 28.5 Light Userdata 第29...

    源码:Java+Redis的库存处理(利用lua脚本)

    背景:我们的订单处理系统中,对库存的更改在这之前一直是使用的数据库update,但是近几年直播带货盛行,经常会出现短时间内同一个商品的销售量高达几十万甚至上百万,但因为高频率的更新同一条库存数据,受到数据库...

    rFSM:rFSM是Lua中的轻量级Statechart实现

    作为Lua域的特定语言,rFSM继承了其宿主语言的可扩展性。文献资料请参阅可以在找到有关如何使用OROCOS RTT框架使用rFSM的信息。下载可以在git存储库中找到代码。 总结DSL的备忘单可。执照rFSM已获得许可接触请直接...

    Poncho-2.0:在魔兽世界中通过继承实现面向对象框架类的库

    一个在魔兽世界中通过继承实现面向对象框架类的库。 在《魔兽世界》中模拟框架类并不简单:Lua默认不支持类,并且一旦创建框架就无法将其释放。 更进一步,可以将框架分配给xml模板和全局名称,一旦设置就无法更改...

    object-lua:[已弃用] Lua 的面向类的 OOP 模块

    [已弃用] 我现在更喜欢在 Lua 和 JavaScript 中使用原生。 为了获得灵感,您可以查看这些 JS 参考资料: 演示文稿的链接到其他对象的对象(OLOO) 部分, ,博客文章。 当然,关于原型对象的历史论文: ,Henry ...

    luawrapper

    能力支持函数式的定义一个Lua类,而且使之继承自C++或者Lua. Lua类可以覆写从 C++ 基类 继承来的虚函数. 她的目标平台是Lua 5.0 ,不能支持Lua 4.0 . 她利用模板原编程技术实现.这意味着,你不需要额外的预处理过程去...

    棋牌的胡牌算法。实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本.zip

    面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这...

    棋牌的胡牌算法。实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本。.zip

    面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这...

Global site tag (gtag.js) - Google Analytics