让lua面向对象--lua和android

让lua面向对象

lua本身不支持面向对象的特性,但是由于lua是基于原型(prototype)的语言,要实现面向对象的特性也是有一定的方法的,实现方式有很多种, 总结了一下我最近对使用lua实现面向对象的特性,主要可以分为以下两种不同的方式来实现:

  1、使用metatable的__index域实现,实现的时候需要利用的lua语言的一些特性才可以实现,主要有:

  a、将table b作为table a的一个prototype的方法:setmetatable(a, {__index = b});

  b、lua5.1中实现的module机制;

  通过这两个技术你可以实现一个基础类,实现类的inherit和new方法:

  -----------------------------------------------------------------------   --filename:"obj.lua"   local setmetatable = setmetatable   module"obj"   function inherit (self)   return function (newclass)   setmetatable (newclass, self)   self.__index = self   return newclass   end   end   function new (self, o)   o = o or {}   setmetatable (o, self)   self.__index = self   return o   end   ----------------------------------------------------------------------   --Now you can define a new class which extends the previous `obj‘:   --filename:"myobj.lua"   local obj = require"obj"   module ("myobj", obj:inherit())   --Class `myobj‘ will "inherit" the methods `new‘ and `inherit‘ from class `obj‘.

  优点:

  1、由于子类的很多数据和方法都是共用了父类的,用到父类的数据和方法的时候,只是在使用的时候才直接调用父类的方法和数据,这样可以减少程序内存的消耗,更主要的是,父类在运行期的修改是会影响到子类的;

  2、充分利用了lua语言的特性,父类的方法和数据的访问是解析器来做的,所以效率上的开销还是比较小的;

  缺点:

  1、如果父类中有一个数据是一个引用的时候(如table)的时候,就会出现在一个子类中操作这个table会改变其他子类的情况,造数据的不一致,所以应该尽量避免这种类的创建,如果有这样的需求的话,就需要对inherit和new函数进行一些特殊的操作,简单来说就是加一个init函数,将所有这类的数据都显示的创建一下。

  2、由于每次取操作都需要在metatable中取,所以,每次就会增加一层继承,就增加一个函数调用的开销,虽然是由解析器来做的,但是如果层次多了的话,还是有开销的;

  2、使用table拷贝的方式实现,实现的时候利用的lua的技术为:

  a、使用lua实现一个table拷贝的函数;

  b、lua5.1中实现的module机制;

  通过这两个技术你可以实现一个基础类,实现类的inherit和new方法:

  -----------------------------------------------------------------------   --filename:"obj.lua"   local setmetatable = setmetatable   module"obj"   function inherit (self)   return function (newclass)   newclass = table.clone(self)   return newclass   end   end   function new (self, o)   o = o or {}   o = table.clone(self)   return o   end   ----------------------------------------------------------------------   --Now you can define a new class which extends the previous `obj‘:   --filename:"myobj.lua"   local obj = require"obj"   module ("myobj", obj:inherit())   --Class `myobj‘ will "inherit" the methods `new‘ and `inherit‘ from class `obj‘.

  优点:

  1、父类中的数据是全部拷贝到子类中的,所以,不存在数据不一致的情况;

  2、所有的函数调用和数据调用都是直接调用每个实例的,不需要到父类中查找;

  缺点:

  1、全部数据的copy,在创建的时候就会增加一个table copy的过程,影响效率;

  2、全部数据和方法都是在创建的时候拷贝一份的,会增加很多的内存消耗,而且如果在运行期改变了父类,并不能改变子类;

  总结:

  结合这两种方式的有缺点,从一个面向对象的角度来说,第一种方式更加适合实现面向对象的特性,第二种方式对面向对象的模拟就牵强一些(缺点2),但是从使用的角度来说,因为在访问数据和方法速度上,第二种方式还是有优势的,所以,在具体的使用的时候,可以灵活一下使用,将两者结合一下。

  比如说,对于客户端这边来说,类在开始创建好了以后就一般不需要修改了,而且子类一般都是需要父类的所有的方法和数据的,所有我们就可以使用第二种方式,而生成对象实例的时候,对象的实例一般都不会调用类的所有的方法,而且用完了这个实例,就会销毁的,所以,我们这里就可以采用第一种方式,结合一下设计可以是:

  -----------------------------------------------------------------------   --filename:"obj.lua"   local setmetatable = setmetatable   module"obj"   function inherit (self)   return function (newclass)   newclass = table.clone(self)   return newclass   end   end   function new (self, o)   o = o or {}   setmetatable (o, self)   self.__index = self   return o   end   ----------------------------------------------------------------------   --Now you can define a new class which extends the previous `obj‘:   --filename:"myobj.lua"   local obj = require"obj"   module ("myobj", obj:inherit())   --Class `myobj‘ will "inherit" the methods `new‘ and `inherit‘ from class `obj‘.

时间: 2024-10-11 20:07:33

让lua面向对象--lua和android的相关文章

Lua程序设计之————Lua面向对象2

----------------------------------------------------------- Lua面向对象3 local smartMan = { name = "Tinywan", age = 26, money = 800000, sayHello = function() print("Tinywan say 大家好") end } local t1 = {} local mt = { __index = smartMan, __n

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

Lua程序设计之————Lua面向对象1

完整代码 local mt = {} mt.__add = function(t1,t2) print("两个Table 相加的时候会调用我") end local t1 = {} local t2 = {} -- 给两个table 设置新的元表,一个元表就是一个table的值 setmetatable(t1,mt) -- meta:元素 setmetatable(t2,mt) -- 进行相加操作 local t = t1 + t2 print(t) --[[输出结果 两个Table

lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)

lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现. 首先,一般来说一个表和它的元表是不同的个体(不属于同一个表),在创建新的表时,不会自动创建元表. setmetatable函数:设置元表 setmetatable( 表1 , 表2 )  将表2挂接为表1的元表,并且返回经过挂接后的表1

Lua面向对象设计

面向对象的基础是类,但Lua中没有提供类的概念,所以我们需要利用Lua现有的机制来实现类似于类的有关oop的一整套概念.基本方案是使用table来实现类机制,并且结合使用self参数和冒号操作.我们先来看看self参数和冒号操作符的用法: self参数的使用是很多面向对象语言的要点,大多数OO语言将这种机制隐藏起来,这样程序员不必声明这个参数(虽然仍然可以在方法内使用这个参数).Lua也提供了通过使用冒号操作符来隐藏这个参数的声明(通过冒号来声明函数).先来看下这段代码(这里面还不涉及到类的定义

lua 面向对象编程类机制实现

lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype based 语言没啥优势. lua 如何构建class机制? https://github.com/fanqingsong/oopclass.lua 提供lua的 Object Oriented Programing Class 实现: 比其他实现更加轻量 https://github.com/Yonab

FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器[转]

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一.Lua的轻量.小巧.概念之简单,都使他变得越来越受欢迎.本人也使用过python做嵌入式脚本,二者各有特点,关于python之后会写相关的文章,python对于我而言更喜欢用来编写工具,我前边一些相关的算法也是用python来实现的.今天主要讲Lua相关的开发技术.Lua具有如下特点: Lua 拥有虚拟机的概念,而其全部用标准C实现,不依赖任何库即可编译安装,更令人欣喜的是,整个Lua 的实现代码并不算多,

【Lua】Lua中__index与元表(转)

转载于:http://blog.csdn.net/xocoder/article/details/9028347 Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的. 举例说明: tempTable = {} print(tempTable.memberA) --这里试图打印tempTable并不存在的成员memberA 执行结果:nil输出为nil的

错误gcc -O2 -Wall -DLUA_COMPAT_ALL -DLUA_USE_LINUX -c -o lua.o lua.clua.c:67:31: error:

编译Lua时,出现这样的错误: gcc -O2 -Wall -DLUA_COMPAT_ALL -DLUA_USE_LINUX -c -o lua.o lua.clua.c:67:31: error: 查阅了一下,centOS上需要安装readline-devel ncurses-devel yum install readline-devel ncurses-devel 测试平台成功. [[email protected] lua-5.2.3]# make linux test cd src &