cocos2dx开发中的lua继承

cocos2dx-lua function.lua 定义了class方法,让lua实现继承像传统语言一样漂亮和方便

看定义

function class(classname, super)  
    local superType = type(super)  
    local cls  
  
    --如果父类既不是函数也不是table则说明父类为空  
    if superType ~= "function" and superType ~= "table" then  
        superType = nil  
        super = nil  
    end  
  
    --如果父类的类型是函数或者是C对象  
    if superType == "function" or (super and super.__ctype == 1) then  
        -- inherited from native C++ Object  
        cls = {}  
  
        --如果父类是表则复制成员并且设置这个类的继承信息  
        --如果是函数类型则设置构造方法并且设置ctor函数  
        if superType == "table" then  
            -- copy fields from super  
            for k,v in pairs(super) do cls[k] = v end  
            cls.__create = super.__create  
            cls.super    = super  
        else  
            cls.__create = super  
            cls.ctor = function() end  
        end  
  
        --设置类型的名称  
        cls.__cname = classname  
        cls.__ctype = 1  
  
        --定义该类型的创建实例的函数为基类的构造函数后复制到子类实例  
        --并且调用子数的ctor方法  
        function cls.new(...)  
            local instance = cls.__create(...)  
            -- copy fields from class to native object  
            for k,v in pairs(cls) do instance[k] = v end  
            instance.class = cls  
            instance:ctor(...)  
            return instance  
        end  
  
    else  
        --如果是继承自普通的lua表,则设置一下原型,并且构造实例后也会调用ctor方法  
        -- inherited from Lua Object  
        if super then  
            cls = {}  
            setmetatable(cls, {__index = super})  
            cls.super = super  
        else  
            cls = {ctor = function() end}  
        end  
  
        cls.__cname = classname  
        cls.__ctype = 2 -- lua  
        cls.__index = cls  
  
        function cls.new(...)  
            local instance = setmetatable({}, cls)  
            instance.class = cls  
            instance:ctor(...)  
            return instance  
        end  
    end  
  
    return cls  
  
end  
写个测试代码,注意出错的部分

local Base = class('Base')  
Base.__index = Base  
  
function Base:ctor(id)  
    print('Base:ctor',id)  
    self.id = id  
end  
  
local ExtBase = class('ExtBase',Base)  
ExtBase.__index = ExtBase  
  
function ExtBase:ctor(id)  
    --Base:ctor(id)  
    super(self,id)  
    print('ExtBase:ctor',id)  
end  

受传统语言影响,会在子类调用基类的构造函数,而事实上,这导致直接将类型本身作为对象实例传入导致self指向是那个类型本身(也是个table)那就只能这么写了

Base.ctor(self,id)
有点丑了样,封装一下super函数,看起来好看一点。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值