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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自学HarmonyOS应用开发(68)- 获取并表示文件系统信息
接下来我们想通过一个文件浏览器应用,练习文件系统操作,文件表示等功能,本文首先说明获取并表示文件系统内容的方法。还是先看演示视频:
面向对象思考
2021/09/24
4940
自学HarmonyOS应用开发(66)- 自定义布局(1)
Harmony应用开发文档中为Java开发者提供了6种UI布局,可以满足开发者的大部分需求。但是有一个问题是:这些布局一旦显示,用户便无法进行调整。我们开发一个自定义布局来解决这个问题。以下是效果演示:
面向对象思考
2021/09/02
4910
HarmonyOS学习路之开发篇—Java UI框架(自定义组件与布局 二)
当Java UI框架提供的布局无法满足需求时,可以创建自定义布局,根据需求自定义布局规则
爱吃土豆丝的打工人
2023/10/14
2090
HarmonyOS学习路之开发篇—Java UI框架(自定义组件与布局 二)
自学HarmonyOS应用开发(75)- 显示拍摄结果
照片拍摄完成接下来的动作就是确认拍照结果。我们的实现方法是对前面文章中用到的文件浏览器功能进行扩展,从而实现一个简单的照片浏览器功能。
面向对象思考
2021/11/25
5770
自学HarmonyOS应用开发(75)- 显示拍摄结果
自学鸿蒙应用开发(33)- 在布局中使用自定义UI组件
组建容器类ArcProgressBarContainer负责协调每个ArcProgressBar的描画动作。
面向对象思考
2021/03/16
9470
鸿蒙小游戏-数字华容道 自定义组件的踩坑记录
前两天看到HarmonyOS开发者官网上发布的一个挑战HarmonyOS分布式趣味应用的帖子,然后有个想法想搞一个小游戏出来,结果三天的时间都卡在了自定义组件上,使用了各种方式方法去实现功能,但是还是没有达到预期的效果,暂时先做个小总结,其实坑有的时候真的很深…
爱吃土豆丝的打工人
2021/11/10
4030
鸿蒙小游戏-数字华容道 自定义组件的踩坑记录
自学HarmonyOS应用开发(70)- 解决ListContainer默认优化问题
使用FileBrowser在目录之间进行切换时,发现了一个问题:本来只应该在出现在返回上级目录列表项上面的<<按钮会按照一定的频率出现在其他列表项上。具体请参见下面的视频:
面向对象思考
2021/09/24
3200
自学HarmonyOS应用开发(47)- 自定义switch组件
HarmonyOS应用开发都会用到各种各样的UI组件,开发者可以根据需求在布局文件设定UI组件各种属性。但是需求是多种多样
面向对象思考
2021/06/09
3610
自学鸿蒙应用开发(5)- button组件
代码中按钮id被指定为hello_button,这个信息会在下面的响应代码中用到。
面向对象思考
2020/12/31
9010
自学鸿蒙应用开发(5)- button组件
自学鸿蒙应用开发(44)- 秒表应用开发(2)
在本应用的布局中,我们使用了指针式秒表组件、两个操作按钮和一个表示计时结果的Text组件:
面向对象思考
2021/06/09
9610
自学鸿蒙应用开发(9)- TimePicker组件
如下面代码中21行~49行所示,在获取TimePicker组件后,一方面在button的动作响应中计算所选时刻和当前时刻的秒数差之后用小窗口表示出来;另一方面在用户操作TimePicker时将选择结果表示在TextFile组件上。
面向对象思考
2021/01/13
4480
鸿蒙 PageSlider 滑动组件基础用法【鸿蒙专题9】
各位同学大家好 有断时间没有给大家更新文章了具体多久我也记得了。最近还在学习鸿蒙开发, 学到了PageSlider 滑动组件类似安卓里面 viewpager 可以实现 屏幕左右滑动的效果 ,那么废话不多说我们正式开始
徐建国
2022/03/30
1.1K0
鸿蒙 PageSlider 滑动组件基础用法【鸿蒙专题9】
自学鸿蒙应用开发(18)- Ability内部画面迁移
布局代码中第59行~第97行的用于生成分别向组件Slice,列表Slice和标签页Slice进行迁移的按钮。程序执行时的画面表示如下:
面向对象思考
2021/01/14
3890
自学鸿蒙应用开发(18)- Ability内部画面迁移
自学鸿蒙应用开发(15)- ScrollView
如下代码中第2行~第10行和第137行所示,可以很简单地在布局中增加ScrollView组件。
面向对象思考
2021/01/13
6750
自学鸿蒙应用开发(43)- 秒表应用开发(1)
从本篇文章开始,边学边练开发一个秒表应用,本文是本系列的第一篇:绘制表盘。先看演示视频:
面向对象思考
2021/06/09
6670
【HarmonyOS 专题】04 简单了解 Button 按钮属性
和尚之前简单学习了 HarmonyOS Text 文本的基本属性,今天来学习一下 Button 按钮的基本应用;
阿策小和尚
2022/03/29
1K0
【HarmonyOS 专题】04 简单了解 Button 按钮属性
【愚公系列】2022年01月 华为鸿蒙OS-03-四种模式开发实操
这两种方式创建出的布局没有本质差别,但是XML方式较为方便简单,以后开发中,也都是用XML布局的方式。但是这两种方式都需要我们熟悉。所以,所以我们将通过XML的方式布局第一张页面,然后再通过代码的方式布局第二张页面。
愚公搬代码
2022/01/21
5530
【愚公系列】2022年01月 华为鸿蒙OS-03-四种模式开发实操
怎么使用Java开发HarmonyOS
本文适用于HarmonyOS应用开发的初学者。通过构建一个简单的具有页面跳转功能的应用(如下图预览器运行效果所示),熟悉HarmonyOS应用开发流程。
程思扬
2022/01/11
1.3K0
怎么使用Java开发HarmonyOS
HarmonyOS实战—服务卡片初体验
最近看到很多博客网站上出现了HarmonyOS的征文活动,看到那些精美的奖品让我也安耐不住开了,当然奖品的诱惑当然是抵挡不住我对技术的狂热追求,对于开发者而言技术没有顶峰没有终点。那么今天给大家做一个卡片服务开发的经验分享,如果有什么地方说的不对的请各位开发者进行指正,如果有什么问题也可以发私信或者直接在帖子中留言,我也会及时回复大家。
爱吃土豆丝的打工人
2021/11/10
1.2K0
HarmonyOS实战—服务卡片初体验
自学鸿蒙应用开发(11)- RadioButton和RadioContainer
本文介绍在鸿蒙应用中RadioButton和RadioContainer组件的基本用法。
面向对象思考
2021/01/13
5640
推荐阅读
相关推荐
自学HarmonyOS应用开发(68)- 获取并表示文件系统信息
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验