cocos2dx-lua class语法糖要注意了

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函数,看起来好看一点。。
function super(o,...)

    --if (o and o.super and o.super.ctor) then

        o.super.ctor(o,...)

    --end

end

 

你可能感兴趣的:(cocos2dx)