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