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

lua面向对象实现:


一个类就像是一个创建对象的模具。有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例。lua则没有类的概念,每个对象只能自定义行为和形态。不过,要在lua中模拟类也并不困难。


lua中,面向对象是用元表这个机制来实现。


首先,一般来说一个表和它的元表是不同的个体(不属于同一个表),在创建新的表时,不会自动创建元表。

setmetatable函数:设置元表


setmetatable( 表1 , 表2 )  将表2挂接为表1的元表,并且返回经过挂接后的表1


__index字段:

元表中的__index字段,是一个非常强大的字段,它为回溯查询提供支持。而面向对象的实现基于回溯查询


当访问一个table中不存在的字段时,得到的结果为nil。但是如果这个表有元表的话,这个访问就会查找元表中的__index字段。如果没有__index字段没有赋值,那么访问结果为nil。否则,就由__index字段提供最终的结果。


__index可以赋值为一个函数,也可以是个表。是函数时,就会调用这个函数。是表的时候,就以相同的方式重新访问这个表。


注意:这里出现了三个表的个体,

我们直接操作的表,称之为表A,表A的元表称之为表B,表B的__index字段赋值的表,称之为表C

如果访问表A中的一个字段时,如果找不到,会去查看表A有没有元表B,如果有的话,就会查找B中的__index字段是否有赋值,如果赋值为表C,就会去表C中查找有没有想访问的那个字段,如果找到了,就返回那个字段,如果没有,就返回nil。


lua面向对象--对象创建


我们可以利用元表和元表__index字段来实现类对象的创建

在该类的构造函数中,定义一个新的表,然后把该类(表)设置为新定义的那个表的元表的__index字段,这样,当我们用实例的对象来调用该类的某个字段的时就会去该类中查找调用,这样就实现了对象的实例化。


例子


class.lua


local    class  = {}


function  class:new()

local self = {}     —创建新的表作为实例的对象

setmetatable( self , {__index = class})  —设置class为对象元表的__index

return self         —返回该新表

end


function class:func()

print(“class : func”)

end


return class


main.lua


local class = require(“class”)


s1 = class:new()   — 实例化对象s1


s1:func()               ——->class : func



lua面向对象--继承


lua实现继承和实现对象实例化是一样的,利用元表和元表的__index字段来实现。


例子


class1.lua


local class1

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值