【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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua是一种脚本语言,它支持面向对象编程。在Lua中,我们可以通过表(table)来实现面向对象编程。表可以被看作是一个对象,它可以存储任意型的数据(包括函数),还可以作为其他表的元素。下面是使用Lua实现面向对象的一些基本步骤: 1. 创建一个表,它代表一个 2. 在这个表中定义一个构造函数,用于创建该的实例 3. 在这个表中定义其他成员函数和成员变量 4. 在这个表中定义一个元表,用于实现继承和多态 下面是一个简单的例子,展示了如何使用Lua实现一个名为Person的: ```lua -- 创建一个Person Person = {} -- 定义Person的构造函数 function Person:new(name, age) local obj = {} obj.name = name obj.age = age setmetatable(obj, self) self.__index = self return obj end -- 定义Person的成员函数 function Person:sayHello() print("Hello, my name is " .. self.name .. ", I'm " .. self.age .. " years old.") end -- 创建一个Person对象 local person = Person:new("Tom", 20) -- 调用对象的成员函数 person:sayHello() ``` 在这个例子中,我们首先创建了一个空表Person,它代表一个。然后我们定义了Person的构造函数new,用于创建Person的实例。在构造函数中,我们创建了一个新表obj,并将name和age属性赋值给它。然后我们使用setmetatable函数将obj的元表设置为Person,并将self设置为__index。这样做可以让obj继承Person的成员函数。最后,我们返回obj。 接下来,我们定义了Person的成员函数sayHello,它用于打印出人的姓名和年龄。在最后,我们创建了一个Person对象person,并调用它的成员函数sayHello。 如果你想要继承Person,你可以创建一个新的表Student,并将它的元表设置为Person。这样做可以让Student继承Person的成员函数和属性。如果你想要重写某个成员函数或属性,你可以直接在Student表中重新定义它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值