美文网首页
【Lua】之面向对象,类的完整实现

【Lua】之面向对象,类的完整实现

作者: 水曜日鶏 | 来源:发表于2020-02-11 22:27 被阅读0次

    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

    相关文章

      网友评论

          本文标题:【Lua】之面向对象,类的完整实现

          本文链接:https://www.haomeiwen.com/subject/sppffhtx.html