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() 方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM