【Lua】之面向對象,類的完整實現

Lua面向對象作爲遊戲面試時的高頻考試題,屬於必須會的知識點。以下內容提供了一個完整的類的創建模板。包括繼承,函數重載,構造函數以及類的實例化。

  • 基類模板的創建,新建一個BassClass.lua存放下面內容。以後每定義一個新的類,這個腳本都不用更改
local _class = {}

local function Init(obj, ...)
    local create
    create = function(classtype, ...)
        if classtype.supper then
            create(classtype.supper, ...)
        end
        if classtype.__init then
            classtype.__init(obj, ...)
        end
    end

    create(obj._class_type, ...)
end

local function New(classtype,...)
    local obj = {}
    obj._class_type = classtype
    setmetatable(obj,{__index = _class[classtype]})
    _class[classtype]:Func()
    Init(obj,...)

    return obj
end

function BaseClass(classname,supperclass)
    local class_type = {}

    class_type.__init = false
    class_type.__cname = classname
    class_type.supper = supperclass
    class_type.New = function(...)
        return New(class_type, ...)
    end

    local vtbl = {}
    _class[class_type] = vtbl
    setmetatable(class_type, {
        __newindex = function(table, key, value)
            vtbl[key] = value
        end,
        __index = vtbl
    })

    if supperclass then
        setmetatable(vtbl, {
            __index = function(table, key)
                return _class[supperclass][key]
            end
        })
    end
    
    return class_type
end
  • 新類的定義。下面定義了class1和class2。
    __init是構造函數,Func是class1獨有的方法。
    只需要一行代碼就能表示class2繼承自class1,非常方便。
require("BaseClass")

local class1 = BaseClass("Class1")

local function class1Init(self)
    print("class1Init")
    
end 

local function Func(self)
    print("class1Func")
end

class1.__init = class1Init

class1.Func = Func

local class2 = BaseClass("Class2",class1)

local function class2Init(self)
    print("class2Init")
end

class2.__init = class2Init
  • 類的實例化
-- result:
-- class1Init
-- class2Init

local class2Instance = class2.New()

-- result
-- class1Func
class2Instance:Func()
  • 構造class2的調用流程

image

  • _class、classtype和new出來的實例之間的關係
    image
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章