【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

猜你喜欢

转载自blog.csdn.net/j756915370/article/details/104271393