码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2dx-lua class语法糖要注意了

时间:2014-07-28 14:27:13      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   cti   代码   

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函数,看起来好看一点。。

cocos2dx-lua class语法糖要注意了,布布扣,bubuko.com

cocos2dx-lua class语法糖要注意了

标签:style   blog   color   os   io   for   cti   代码   

原文地址:http://www.cnblogs.com/linbc/p/3871839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!