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

lua中继承

https://blog.codingnow.com/cloud/LuaOO
https://www.cnblogs.com/NiYun/p/8621032.html

local _class={}
 
function class(super)
	local class_type={}
	class_type.ctor=false
	class_type.super=super
	//定义新类的new方法,new方法返回的是一个对象
	class_type.new=function(...) 
			local obj={}
			do
				local create
				create = function(c,...)
					if c.super then
						create(c.super,...)
					end
					if c.ctor then
						c.ctor(obj,...)
					end
				end
 
				create(class_type,...)
			end
			setmetatable(obj,{ __index=_class[class_type] }) //设置对象的元表,元表不是类class_type,而是vtbl
			return obj
		end
	local vtbl={} //这里还是很诡异的,不是很明白
	_class[class_type]=vtbl
 
	setmetatable(class_type,{__newindex=
		function(t,k,v)
			vtbl[k]=v
		end
	})
 
	if super then
		setmetatable(vtbl,{__index=
			function(t,k)
				local ret=_class[super][k]
				vtbl[k]=ret
				return ret
			end
		})
	end
 
	return class_type //这里返回的是一个类
end

现在,我们来看看怎么使用:

base_type=class()		-- 定义一个基类 base_type
 
function base_type:ctor(x)	-- 定义 base_type 的构造函数
	print("base_type ctor")
	self.x=x
end
 
function base_type:print_x()	-- 定义一个成员函数 base_type:print_x
	print(self.x)
end
 
function base_type:hello()	-- 定义另一个成员函数 base_type:hello
	print("hello base_type")
end

以上是基本的 class 定义的语法,完全兼容 lua 的编程习惯。我增加了一个叫做 ctor 的词,作为构造函数的名字。
下面看看怎样继承:

test=class(base_type)	-- 定义一个类 test 继承于 base_type
 
function test:ctor()	-- 定义 test 的构造函数
	print("test ctor")
end
 
function test:hello()	-- 重载 base_type:hello 为 test:hello
	print("hello test")
end

现在可以试一下了:

a=test.new(1)	-- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x()	-- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello()	-- 输出 hello test ,这个函数被重载了。

相关文章:

  • SPOJ REPEATS Repeats (后缀数组:子串的最大循环节)题解
  • lua在什么时候设置元表失败呢
  • lua中通过__index继承父类的属性
  • C++中匿名函数的捕获列表和匿名函数的说明
  • lua中通过__index继承父类的方法
  • lua中函数闭包
  • Entity Framework加载相关实体——Lazy Loading
  • C++函数对象包装器std::function
  • cygwin 安装
  • shell 1
  • C#中FileStream——循环RingBuffer
  • 二分查找算法(折半查找算法)
  • C#中的lock和Monitor.Enter和Monitor.Exit
  • Unity调用外部的exe
  • 【CF1095F】 Make It Connected(最小生成树)
  • Codepen 每日精选(2018-3-25)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • exports和module.exports
  • HashMap ConcurrentHashMap
  • Javascript弹出层-初探
  • js中的正则表达式入门
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Map集合、散列表、红黑树介绍
  • oldjun 检测网站的经验
  • Python学习之路16-使用API
  • Redux 中间件分析
  • vue 个人积累(使用工具,组件)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 机器学习学习笔记一
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 容器服务kubernetes弹性伸缩高级用法
  • 因为阿里,他们成了“杭漂”
  • 栈实现走出迷宫(C++)
  • # include “ “ 和 # include < >两者的区别
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #etcd#安装时出错
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #宝哥教你#查看jquery绑定的事件函数
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (bean配置类的注解开发)学习Spring的第十三天
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (pojstep1.1.2)2654(直叙式模拟)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .bat批处理(六):替换字符串中匹配的子串
  • .java 9 找不到符号_java找不到符号
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET6实现破解Modbus poll点表配置文件
  • [] 与 [[]], -gt 与 > 的比较
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [acwing周赛复盘] 第 94 场周赛20230311