用Lua定义一个类

前置知识点

首先,lua并不是一个面向对象的语言,但是我们可以通过适当的方法来模拟出面向对象的效果。
在lua里,最像对象的我们可以马上联想到lua中的表。但是我们印象中的对象普遍都有属性和方法,但表里面好像只有属性啊。比如,

local obj = { a = "a",  b = "b" }

没关系,上面我们也说了,需要使用适当的方法模拟。我们只需要改变一下思路,

local obj = {
    a = "a",
    b = "b",
    print = function(msg1, msg2)
        print(msg1..msg2)
    end
}
obj.print("c", "d")
-- 输出 cd

这样一来,是不是就好像obj拥有了一个方法print

但其实lua给我们提供了一种更方便,功能更丰富的方法来给表提供方法

local obj = {
    a = "a",
    b = "b",
}

function obj:print()
    print(self.a..self.b)
end

obj:print()
-- 输出 ab

我们可以用这种在方法名前加上对象名和冒号的方式将方法绑定到对象上,在调用方法的时候也是一样
需要注意的是,使用这种方法,会给我们带来一个极大的便利,就是上面示例中的self变量,这个self变量类似于java中的this关键字,指代调用该方法的对象实例,在本例中就是指代obj对象

定义类

上面我们虽然拥有了方法,但还没办法像传统对象一样,通过一个模板(即我们熟知的类),来创建许许多多拥有相同初始属性和方法的对象,所以现在我们就需要进一步模拟

local Person = { }

function Person:New(name, age)
    local obj = {}
    setmetatable(obj, self)
    self.__index = self
    obj.name = name
    obj.age = age
    return obj
end

function Person:Print()
    print(self.name, self.age)
end

local p = Person:New("jack", 18)
p:Print()

上面我们给Person这个表添加了两个方法,New和Print。
其中New就类似我们熟知的构造方法,
我们先在New方法中定义了一个局部变量表obj,
并且将obj的元表(对元表以及后续一些lua中的概念不清楚的同学需要自行去菜鸟教程学习哈,本人比较懒,同时也不想引入太多与本文主题无关的概念,菜鸟地址:https://www.runoob.com/lua/lua-metatables.html )设置为self(这里的self指代Person表),
然后为元表设置元方法__index,对象为self,这样以后在obj上找不到的属性或者方法,就会再去Person表上找,
最后是常规的赋值,以及将obj作为返回值返回出去。
这样每次调用Person表的New方法就会得到一个拥有相同初始属性和方法的对象了。
也就相当于我们模拟了一个Person类

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值