zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    安装IIS的郁闷之旅
    设置WPF窗口相对于非WPF窗口的位置
    钓鱼记
    java拾遗
    人间四月芳菲尽
    [linux] x server can not start under VMWare
    如果没有开源软件没有免费软件,这个世界会怎么样?评[盖茨北大演讲遭遇开源人士抗议]
    程序员的面包
    2007中国软件英雄会-七年的等待
    sysbench安装
  • 原文地址:https://www.cnblogs.com/linbc/p/3871839.html
Copyright © 2011-2022 走看看