cocos2dx lua中继承与覆盖C++方法

cocos2dx的extern.lua中的class方法为lua扩展了面向对象的功能,这使我们在开发中可以方便的继承原生类

但是用function返回对象的方法来继承C++类是没有super字段的,这使得在需要重写父类方法的时候没办法调用父类方法

在某位大神的博文中看到的代码

local _setVisible = nil
local MyLayer = class("MyLayer", function()
    local layer = CCLayer:create()
    -- save c++ member method point.
    _setVisible = layer.setVisible
    return layer
end)
-- override CCLayer::setVisible
function MyLayer:setVisible(visible)
    -- invoke CCLayer::setVisible
    _setVisible(self, visible)
    -- to do something.
end
return MyLayer

下面这种方法是在metatable中一层一层递归的找指定函数,比上面那种优美很多

local function getSuperMethod(table, methodName)
    local mt = getmetatable(table)
    local method = nil
    while mt and not method do
        method = mt[methodName]
        if not method then
            local index = mt.__index
            if index and type(index) == "function" then
                method = index(mt, methodName)
            elseif index and type(index) == "table" then
                method = index[methodName]
            end
        end
        mt = getmetatable(mt)
    end
    return method
end
local MyLayer = class("MyLayer", function()
    return CCLayer:create()
end)
-- override CCLayer::setVisible
function MyLayer:setVisible(visible)
    -- invoke CCLayer::setVisible
    getSuperMethod(self, "setVisible")(self, visible)
    -- to do something.
end
return MyLayer

在lua中继承cocos2dx的C++类还是有诸多不便的,有些时候用装饰者模式更好

转载于:https://www.cnblogs.com/gagugagu/p/4175616.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值