本篇在讲什么 Lua中的面向对象的实现 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text编辑器 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 |
![]() ★提高阅读体验★ 👉 ♠ 一级标题 👈👉 ♥ 二级标题 👈👉 ♣ 三级标题 👈👉 ♦ 四级标题 👈 |
♠ 前言
本章节了解一下Lua如何实现面向对象编程
♠ 表的特性
首先我们需要知道,Lua的表是关键,Lua面向对象编程基本上是基于表的特性来实现的
如果你对表还不太了解,建议先过一遍Lua的类型和基本语法
我们知道Lua表的键值可以是除了nil的任意类型,如此,我们可以为其设置函数,如下所示
-- 学生
Student = {}
-- 获取分数
Student.getGrade = function()
return 0
end
我们声明了一个名为Student
的全局表
我们为表添加属性getGrade
,并为其付了一个方法
可以通过Student.getGrade()
来调用方法,获取学生分数
方法的定义还可以以下的方式,二者没有本质区别
-- 获取分数
function Student.getGrade()
return 0
end
-- 获取分数
function Student:getGrade()
return 0
end
上述代码设计到一点Lua语法糖的内容,可以参考之前文章
为此又有一个比较重要的点self
出现了,self是所有面向对象语言的核心点,Lua语言可以在方法体内代替表本身
上述对方法的定义,基本是就是我们平时比较熟悉的函数了,但是仅仅这些还是不够的
♠ 继承
首先我们了解在Lua中是如何实现继承的概念的
本模块用到了table的元表和元方法相关的内容,本篇不在累述,不熟悉的可以去参考之前的文章
了解元表,应该都对__index
元方法有印象,设置了该元方法的表,在查询的时候会去调用__index元方法,这就满足了继承需要的功能,看下面例子
将表Student
赋值给元表mt的__index方法
给表StudentA
设置mt元表
调用StudentA.grade,StudentA没有,查Student
♠ 类
我们还需要考虑如何通过Lua去实现面向对象的几个特点,包括类体系、继承和私有性
我们稍微修剪一下代码,让结构变得更熟悉,一个简单的根据基类创建新类的过程我们就做好了
-- 学生
Student = {}
function Student:new(o)
o = o or {}
self.__index = self
setmetatable(o, self)
return o
end
function Student:printGrade()
print("Student:5")
end
function Student:printAge()
print("Student:18")
end
-- 小帅
StudentA = Student:new()
function StudentA:printGrade()
print("StudentA:10")
end
print(StudentA:printGrade())
print(StudentA:printAge())
StudentB = StudentA:new()
function StudentB:printAge()
print("StudentB:17")
end
print(StudentB:printGrade())
print(StudentB:printAge())
基类Student
,根据基类延伸出的子类StudentA
,根据子类延伸出的新子类Student
,都可以对父类的方法进行重写,并且可以继承父类的方法和属性
♠ 推送
- Github
https://github.com/KingSun5
♠ 结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。