加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua实现面向对象的特性

发布时间:2020-12-14 22:26:49 所属栏目:大数据 来源:网络整理
导读:? lua实现面向对象的特性 [ 收藏此页] [ 打印] 作者: 来自ITPUB论坛 ??2008-02-21 内容导航: 第1页 第1页: 第1页 文本Tag: Lua 【IT168 技术文档】 lua本身不支持面向对象的特性,但是由于lua是基于原型(prototype)的语言,要实现面向对象的特性也是有一
? lua实现面向对象的特性
[ 收藏此页] [ 打印]
作者: 来自ITPUB论坛??2008-02-21
内容导航:
第1页
文本Tag: Lua

  【IT168 技术文档】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    newclass   end   end   function new (self,o)   o o or {}   setmetatable (o,0);"> o   end    ---------------------------------------------------------------------- Now you can define a class which extends the previous `obj ' : myobj.lua   local obj require   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方法:

 function (newclass)   newclass 
   
    table.clone(self)   
   
    o or {}   o 
   
   .
  
  

  优点:

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

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

  缺点:

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

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

  总结:

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

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

.
  
  

  这里的关键是继承是copy出来的,而实例是采用metatable的方式实现的;



http://tech.it168.com/jd/2008-02-17/200802171004466.shtml

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读