Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >lua面向对象:new,继承,多态

lua面向对象:new,继承,多态

作者头像
立羽
发布于 2023-08-24 07:09:52
发布于 2023-08-24 07:09:52
52100
代码可运行
举报
文章被收录于专栏:Unity3d程序开发Unity3d程序开发
运行总次数:0
代码可运行

概述: lua要实现类,继承,多态

  1. BaseClass(super)为生成基类公共方法,内部开辟新的以class_type为模板返回,主要为类的声明服务,一个类有的__init(构造),__delete(析构),.super(父类),.New(创建对象),setmetatable(class_type, {__index = _class[super]})设置元表,__index指向父类
  2. 类的声明BaseView = BaseView or BaseClass()
  3. 类的继承LoginView = LoginView or BaseClass(BaseView)
  4. 通过设置class_type.New,会再返回一个新的设置子类的元表obj,
  5. New方法里,setmetatable(obj, { __index = _class[class_type] }),把obj与class_type联系起来,并通过递归调用create,依次调用父类__init,子类__init。再注册DeleteMe方法,依次调用子类__delete,父类__delete
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--保存类类型的虚表
local _class = {}
local lua_obj_count = 0

function BaseClass(super)
	-- 生成一个类类型
	local class_type = {}
	-- 在创建对象的时候自动调用
	class_type.__init = false
	class_type.__delete = false
	class_type.super = super
	class_type.New = function(...)
		lua_obj_count = lua_obj_count + 1
		-- 生成一个类对象
		local obj = {_class_type = class_type} --原始表,表里有个key为_class_type的value为刚定义的class_type

		-- 在初始化之前注册基类方法
		setmetatable(obj, { __index = _class[class_type] })

		-- 调用初始化方法
		--如果有基类,相当于用递归,把所有基类的init方法都调用了一遍,,而且是先调用最基类init,再子类的init
		do
			local create
			create = function(c, ...)
				if c.super then
					create(c.super, ...)
				end
				if c.__init then
					c.__init(obj, ...)
				end
			end

			create(class_type, ...)
		end

		-- 注册一个delete方法
		--先调用自己的__delete,再调用基类的__delete
		obj.DeleteMe = function(self)
			lua_obj_count = lua_obj_count - 1
			local now_super = self._class_type
			while now_super ~= nil do
				if now_super.__delete then
					now_super.__delete(self)
				end
				now_super = now_super.super
			end


		end


		return obj
	end

	--[[
	local vtbl = {}
	_class[class_type] = vtbl

	setmetatable(class_type, {__newindex = function(t,k,v) vtbl[k] = v end,
		__index = vtbl
	})

	if super then
		setmetatable(vtbl, {__index = function(t,k) return _class[super][k] end})
	end
--]]


	--记录下创建了多少表
	_class[class_type]  = class_type

	--把父类作为子类的元表
	if super then
		setmetatable(class_type, {__index = _class[super]})
	end


	return class_type
end

BaseView = BaseView or BaseClass()

BaseView.a = 1
BaseView.b = 2

function BaseView:__init()
	print("BaseView:__init")
end

function BaseView:__delete()
	print("BaseView:__delete")
end

function BaseView:DoBaseFunc()
	print("BaseView:DoBaseFunc")
end

function BaseView:DoSomething()
	print("BaseView:DoSomething")
end

LoginView = LoginView or BaseClass(BaseView)


function LoginView:__init()
	print("LoginView:__init")
end

function LoginView:__delete()
	print("LoginView:__delete")
end

function LoginView:DoSomething()
	print("LoginView:DoSomething")
end

ologin_view = LoginView:New() --new 一个对象
ologin_view:DeleteMe()

print(ologin_view.a)
ologin_view.a = 3
print(ologin_view.a)
ologin_view.c = 4
print(ologin_view.c)
print(BaseView.c)
print(ologin_view:DoBaseFunc())
print(ologin_view:DoSomething())

输出

BaseView:__init LoginView:__init LoginView:__delete BaseView:__delete 1 3 4 nil BaseView:DoBaseFunc LoginView:DoSomething

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Lua:面向对象,多态,重载,私有,单例
Lua里面可以做到脚本级别的成员保护,分为:私有成员、公有成员。私有成员就是在脚本全局范围内定义的局部变量,而对于表来说,所有成员都是公有的。 A) 数据成员 私有数据成员,直接在脚本中local定义就行,如上面的基类base赋值语句,这个base就不能在其它脚本被访问到。 公有数据成员,需要写入虚表(对表进行赋值),使用self.xxx就行。 B) 成员函数 私有成员函数:目前的类定义,所有的函数我都是使用local定义的,使用local定义的function如果不写入虚表,那它就是私有的,这点和数据成员一样。 公有成员函数:如果想暴露某个成员函数成为公有函数,只需要在类定义底部写入虚表即可。 例如:
立羽
2023/08/24
5370
Lua学习笔记:实现一个Lua Class生成器
Lua 中的每个值都可以有一个 元表。 这个 元表 就是一个普通的 Lua 表, 它用于定义原始值在特定操作下的行为。 如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。 例如,当你对非数字值做加操作时, Lua 会检查该值的元表中的 "__add" 域下的函数。 如果能找到,Lua 则调用这个函数来完成加这个操作。
晨星成焰
2024/09/12
2040
Lua学习笔记:实现一个Lua Class生成器
Lua实现继承
原文链接:https://www.jianshu.com/p/fefe11d4544e
bering
2019/12/02
3.2K0
lua中的面向对象之继承
阅读本文需求有一定的前置知识,比如什么是面向对象,这边就不再赘述,本文用几个简单的例子讲述下在lua语言环境下的面向对象。
keyle
2024/11/01
1390
lua中的面向对象之继承
【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
  Lua是一门非常强大、非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言。但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便。不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类、继承和多态等面向对象编程具有的特性。
马三小伙儿
2018/09/12
3.5K0
Lua面向对象编程的基本原理示例
关于Lua语言中的table以及metatable的基本知识,这里就不赘述了,官方手册中描述的很清楚。
IOT物联网小镇
2022/09/26
5870
lua 和 cpp 互调
例子中涉及为 lua 编写 so,(lua require 加载) 需要修改 lua/src 下的makefile cppflag 加 -FPIC, 这样后续链接so才不会报错
orientlu
2018/12/24
9600
table
以下是一个简单的 Lua 面向对象编程的完整示例,包括类的定义、继承和方法的调用。
Yolo-Yolo
2024/12/18
1820
table
Lua:table与object
虽然可以使用 Lua 的 table 库提供的 insert 和 remove 操作来实现队列,但这种方式 实现的队列针对大数据量时效率太低,有效的方式是使用两个索引下标,一个表示第一 个元素,另一个表示最后一个元素。
立羽
2023/08/24
3730
Lua热更新
此文章部分内容和思维导图来源于唐老狮相关Lua课程,通过Vistual Studio Code语法测试,如有问题,请在以下留言
七鳄不是鳄
2023/02/27
3.7K0
Lua热更新
Lua⭐️面向对象——属性、函数方法、类、继承
但此时有一个问题,即每次有新name时,都要重新定义person,形成person1、person2等等,非常不方便
星河造梦坊官方
2024/08/15
2570
LUA面向对象编程技巧
详文请见 http://ffown.sinaapp.com/?p=11 1. LUA中的对象 我们知道,对象由属性和方法组成。LUA中最基本的结构是table,So 必须用table描述对象的属性。l
知然
2018/03/09
1.7K0
面向对象封装、继承、多态
身份运算符用于 比较 两个对象的 内存地址 是否一致 —— 是否是对同一个对象的引用
py3study
2020/01/16
6870
面向对象封装、继承、多态
我们的Lua类绑定机制
最近一个人搞后台,框架底层+逻辑功能茫茫多,扛得比较辛苦,一直没抽出空来写点东西。
owent
2018/08/01
2.5K0
我们的Lua类绑定机制
面向对象的三大特性(封装、继承、多态)
继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2
用户1214487
2018/01/23
4.2K0
面向对象的三大特性(封装、继承、多态)
面向对象:继承
继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 一般静态的面向对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。
changxin7
2019/08/14
6240
面向对象:继承
lua--协程、异常处理、面向对象
协程是单核的,是一个线程下执行的,所以每一时刻只会有一个协程在运行。线程一般由cpu调度,协程由用户调用
aruba
2022/06/27
7080
lua--协程、异常处理、面向对象
Lua基础知识总结笔记-八股文
在 Lua 中,面向对象编程主要是通过元表(metatable)和表(table)来实现的。Lua 不像其他语言那样有类的概念,而是使用表来模仿类的行为。
晨星成焰
2024/09/20
3460
Lua基础知识总结笔记-八股文
Lua(3) ——Cocos之_语法糖c
    在使用Lua的时候,cocos2d-x为我们提供了一个 class(classname, super) 这个函数。
py3study
2020/01/06
7500
Lua学习笔记:Lua里metatable元表的使用
在这个例子中,当我们尝试向 readonlyTable 添加一个新键或更新一个已存在的键时,Lua 会调用元表中的 __newindex 方法。由于我们定义了这个方法来抛出一个错误,因此任何对 readonlyTable 的修改都会失败,并抛出一个错误信息。
晨星成焰
2024/09/09
3120
Lua学习笔记:Lua里metatable元表的使用
相关推荐
Lua:面向对象,多态,重载,私有,单例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验