Lua学习笔记之面向对象

目录

1、博客介绍

2、内容

(1)继承

(2)多继承

3、推送

4、结语


 

1、博客介绍

本篇博客为Lua学习笔记之一,介绍Lua面向对象的相关内容,本篇博客将通过几个小例子来实现继承和多继承,查看本篇博客需要对Lua的元表有相关了解,可以跳转博主元表相关文章,博文底部设有传送门。


2、内容

(1)继承

了解元表后,我们知道了,当表B是表A的元表时,我们调用表A的方法或者属性时,若是找不到,则会去表B内的元方法__index内去继续查找相关属性或方法,如此这般我们就找到了继承的思路,我们先写一个父类表如下所示:

local Parent = {}

function Parent:new()
	local proxy = {}
	self.__index = self
	setmetatable(proxy,self)
	return proxy
end

function Parent:print(str)
	print("父类输出:"..str)
end

上述代码很简单,一个表Parent我们作为父类,我们为Parent写了一个方法new(),方法内的重点是self.__index = self,该操作将Parent的元方法__index指向了Parent自己,这样做的好处是,若是Parent作为其他表的元表的时,会直接从Parent内查找相关的属性和方法,因为Parent的__index就指向了自己,然后我们将Parent作为proxy表的元表,并将proxy作为返回值交了出去,下面我们看一下子类的继承:

local child1 = Parent:new()

child1:print("哈哈哈哈")

-----------------------------输出结果
父类输出:哈哈哈哈

function child1:print(str)
	print("子类1输出:"..str)
end

child1:print("哼哼哼哼")

-----------------------------输出结果
子类1输出:哼哼哼哼

上述代码中child1就是通过Parent方法new获取的一个新表,该表的元表就是Parent,在不重写的前提下会去调用Parent的print方法,重写的话也非常简单,用相同方法名再写一遍即可,重写后再调用就是执行重写后的方法。

 

(2)多继承

多继承的实现其实很简单,我们通过上述的例子实现了继承,我们发现查找父类其实就是在元表的元方法__index内去寻找,我们上述的单继承是将__index设置为了一个表,多继承呢就是将__index设置为一个方法,该方法的会在多个表内查找我们需要的方法或者属性,然后将查找到属性或者方法返回。

--search方法用来从多个父类表中查找
local function search(key,list)
	for _,pValue in ipairs(list) do
		local v = pValue[key]
		if v then
			return v
		end
	end
end 

--createClass用来创建子类
function createClass(...)
	local proxy = {}
	local parents = {...}
	local meta = {
		__index = function(self,key)
			return search(key,parents)
		end
	}
	setmetatable(proxy,meta)
	return proxy
end


----------------------------------演示例子
local Parent1  = {}
local Parent2  = {}

function Parent1:print1()
	print("父类1输出")
end

function Parent2:print2()
	print("父类2输出")
end
local child1 = createClass(Parent1,Parent2)

child1:print1()
child1:print2()

----------------------------------输出
父类1输出
父类2输出

上述代码中,我们利用search方法来筛选多个表中的key,我们在createClass方法内,将表proxy的元表的元方法__index设置为search,参数分别是需要查找的key和继承的多个表,如此我们就可以实现多继承的思路,可以参考上述中的演示例子。


3、推送

Github:https://github.com/KingSun5

元表:https://blog.csdn.net/Mr_Sun88/article/details/105205942


4、结语

博主只是很简单的介绍了一下实现思路,更多的功能还需要去不断的完善,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

       QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

  • 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、付费专栏及课程。

余额充值