当前位置: 首页 > news >正文

Lua实现面向对象以及类的继承

0.简单前言

1、面向对象主要四个特征:封装,继承,多态,抽象
2、Lua是种简单精致小巧的语言,其本质是个表(table),变量和方法皆可看作为该表的元素。

P.S. 该博客和代码为个人编写习惯以及为后续博客内容拓展服务考虑,若有错误等不周到的地方还请包涵以及指出。

1.类

尽管可能不太完美,但我们依旧可以通过元表的方式实现类以及类的继承。

-- 元类
local Rectangle = {area = 0, length = 0, breadth = 0}-- 派生类的方法 new
function Rectangle:new (o,length,breadth)local o = o or {}setmetatable(o, self)		-- 将Rectangle赋值给要返回的对象作为元表self.__index = self		-- 通过 .__index 传递元表元素self.length = length or 0self.breadth = breadth or 0self.area = length*breadth;return o
end-- 派生类的方法 printArea
function Square:printArea ()print("矩形面积为 ",self.area)
end

简单结构就是这样,Square类已经继承Rectangle的属性以及方法,同时还拓展出自己的新方法 printArea(),但实际运用起来并不方便。

2.改进

class类

用于构建模板以及进行类的继承

Class.lua

-- params:要实例的类,继承
function class(classname , ...)local cls = {}local supers = {...}for _ , super in ipairs(supers) dolocal superType = type(super)if superType == "function" thencls.__create = superelseif superType == "table" thencls.__supers = cls.__supers or {}cls.__supers[#cls.__supers + 1] = superendendcls.__index = clscls.__class = classnameif not cls.__supers then-- 没有继承其他类-- 添加默认构造函数-- __index指向自己不变cls.Ctor = function()   end      elseif #cls.__supers == 1 then-- 单继承的情况local super = cls.__supers[1]cls = setmetatable(cls , {__index = super})cls.super = super		-- 模拟super关键字else -- 多继承的情况-- 使index指向一个函数,在索引时遍历父类cls = setmetatable(cls , {__index = function(_ , key)for _ , super in ipairs(cls.__supers) doif super[key] thenreturn super[key]endendend})endcls.New = function(...)-- 前面只是将几个类进行合并,因此在实例时还需进行一次元表local instance = setmetatable({}, cls)instance.class = clsinstance:Ctor(...)return instanceend-- 返回实例return cls
end

实验

创建4个脚本A,B,C,D。
使得C继承A,
D继承A,B。

A.lua

A = class(A)function A:Ctor()print("We create a class A!")
endfunction A:Fun_A()print("This is a function from class A!")
endreturn A

B.lua

B = class(B)function B:Ctor()print("We create a class B!")
endfunction B:Fun_B()print("This is a function from class B!")
endreturn B

C.lua

C = class(C , A)                -- 让C类单独继承A类function C:Ctor()print("We create a class C!")
endfunction C:Fun_C()print("This is a function from class C!")
endreturn C

D.lua

D = class(D , A , B)            -- 让D类同时继承A,B类function D:Ctor()print("We create a class D!")
endfunction D:Fun_D()print("This is a function from class D!")
endreturn D

检验

main.lua

-- 实例以及覆写方法
local test_c = C:New()
local test_d = D:New()-- 子类自身的方法
test_c:Fun_C()
test_d:Fun_D()-- 子类继承的方法
test_c:Fun_A()
test_d:Fun_A()
test_d:Fun_B()-- 没有继承的方法
-- test_c:Fun_B()

结果

We create a class C!
We create a class D!
This is a function from class C! 
This is a function from class D! 
This is a function from class A! 
This is a function from class A! 
This is a function from class B! 

若把注释取消,则直接报attempt to call a nil value (method ‘Fun_B’)

http://www.lryc.cn/news/408226.html

相关文章:

  • 机器学习课程学习周报五
  • vue3.0学习笔记(二)——生命周期与响应式数据(ref,reactive,toRef,toRefs函数)
  • C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序
  • 掌握互联网路由选择协议:从基础入门到实战
  • [笔记]ONVIF服务端实现[进行中...]
  • 深度强化学习 ②(DRL)
  • 线性代数重要知识点和理论(下)
  • 独立开发者系列(35)——python环境的理解
  • 中小企业常见的网络安全问题及防范措施
  • Android 线程并发:线程通信:Handler机制
  • 搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表
  • 企业级视频拍摄与编辑SDK的全面解决方案
  • 后端返回列表中包含图片id,如何将列表中的图片id转化成url
  • Python学习笔记44:游戏篇之外星人入侵(五)
  • export在linux中的作用
  • FFmpeg解复用器如何从封装格式中解析出不同的音视频数据
  • 测试-常见问题
  • RSA非对称加密算法(Java实现)
  • netty构建http服务器
  • Docker中安装Kafka和Kafka UI管理界面
  • 防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包
  • C# 冒泡排序
  • 网络传输层——UDP与TCP
  • Hype 4 Pro for Mac:专业级HTML5动画制作利器
  • C++ STL remove, remove_if 用法
  • HarmonyOS NEXT 开发之ArkTS基础入门
  • UE5 C++跑酷练习(Part2)
  • 从0开始搭建vue + flask 旅游景点数据分析系统(二):搭建基础框架
  • 【过滤器 vs 拦截器】SpringBoot中过滤器与拦截器:明智选择的艺术(如何在项目中做出明智选择)
  • 2024-06学习笔记