zoukankan      html  css  js  c++  java
  • class() 高级用法 -- lua

    class() 高级用法
    class() 除了定义纯 Lua 类之外,还可以从 C++ 对象继承类。
    
    比如需要创建一个工具栏,并在添加按钮时自动排列已有的按钮,那么我们可以使用如下的代码:
    
    -- 从 CCNode 对象派生 Toolbar 类,该类具有 CCNode 的所有属性和行为
    local Toolbar = class("Toolbar", function()
        return display.newNode() -- 返回一个 CCNode 对象
    end)
     
    -- 构造函数
    function Toolbar:ctor()
        self.buttons = {} -- 用一个 table 来记录所有的按钮
    end
     
    -- 添加一个按钮,并且自动设置按钮位置
    function Toolbar:addButton(button)
        -- 将按钮对象加入 table
        self.buttons[#self.buttons + 1] = button
     
        -- 添加按钮对象到 CCNode 中,以便显示该按钮
        -- 因为 Toolbar 是从 CCNode 继承的,所以可以使用 addChild() 方法
        self:addChild(button)
     
        -- 按照按钮数量,调整所有按钮的位置
        local x = 0
        for _, button in ipairs(self.buttons) do
            button:setPosition(x, 0)
            -- 依次排列按钮,每个按钮之间间隔 10 点
            x = x + button:getContentSize().width + 10
        end
    end
    class() 的这种用法让我们可以在 C++ 对象基础上任意扩展行为。
    
    ~
    
    既然是继承,自然就可以覆盖 C++ 对象的方法:
    
     
    function Toolbar:setPosition(x, y)
        -- 由于在 Toolbar 继承类中覆盖了 CCNode 对象的 setPosition() 方法
        -- 所以我们要用以下形式才能调用到 CCNode 原本的 setPosition() 方法
        getmetatable(self).setPosition(self, x, y)
     
        printf("x = %0.2f, y = %0.2f", x, y)
    end
    注意: Lua 继承类覆盖的方法并不能从 C++ 调用到。也就是说通过 C++ 代码调用这个 CCNode 对象的 setPosition() 方法时,并不会执行我们在 Lua 中定义的 Toolbar:setPosition() 方法。
  • 相关阅读:
    未来开发构想:
    3种方式遍历repeater中的CheckBox全选
    [常见面试题]一条Sql语句:取出表A中第31到第40记录,ID可能不是连续的
    mpc源代码下载,编译,调试
    哈希表(Hashtable)使用
    ASP.NET常用代码
    [转]Erwin4.1.4与PowerDesign9.5
    Three things everyone should know to improve object retrieval
    Learning the parts of objects by nonnegative matrix factorization (Letters to Nature)
    js 钟表
  • 原文地址:https://www.cnblogs.com/newlist/p/3649320.html
Copyright © 2011-2022 走看看