面向对象的lua

使用lua很久了,对于如何面向对象使用lua还是想说些什么。

  1. 首先我想说的是lua不适合面向对象,或者说他的基因不是为面向对象设计的。
  2. lua可以使用面向对象,作为lua的一个特性可以为我们带来很多惊喜。
如何面向对象:元表

PS:不知道元表的同学请去补习基础知识

例如

Constructer = {}
Constructer.__index = function(_, key)
	print("I am you father")
end
BaseModel = {}
function BaseModel.new()
	setmetatable(cls, Constructer)
	cls.__index = cls
	return cls
end

又例如

Base = {}
function Base:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end
SpaceBace = Base:new()
local instance = SpaceBace:new()

SpaceBase继承了Base的new方法,再次执行new的时候self不是Base而是SpaceBase,同样__index也是SpaceBase,因此instance的原表是SpaceBase,SpaceBase的原表是Base。即instance继承SpaceBase,SpaceBase继承Base。

多重继承

之前我们将原表设置为父类,可以实现继承,那么多重继承其实只需要将原表的__index设置为一个查找函数就可以了

local function search(k, list)
	for i=1,#list do
	    local v = list[i][k]
	    if v then return v end
	end
end
function createClass( ... )
    local o = {}
    local parents = { ... }
    setmetatable(o, {__index = function(t,k)
        return search(k, parents)
    end})
    o.__index = o
end

想面向对象,搞吧。另外 提下raw get rawset:无视自定义的__index, __newindex的get set。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值