面试: lua 实现一个class方法 (单继承)

既然是面向对象,需要有

  1. 需要有构造函数 ctor
  2. 能够继承父类
  3. 有 创建对象的方法 new

核心在于元方法 __index 和__newindex 的理解

local _class = {}   -- 用于存储所有类型

function Class(super)
	local classType = {}
	classType.Ctor = false -- 构造函数
	classType.Super = super
	classType.New = function (...) --- 创建实例的方法
		local obj = {}
		local create 
		create = function (c,...)
			if c.Super then
				create(c.Super)  
			end
			if c.Ctor then  -- 
				c.Ctor(obj,...) 
			end
		end
		create(classType,...)  --递归基类,然后执行构造函数
		setmetatable(obj, {__index = _class[classType]})  -- 将实例的__元方法 指向 类
		return obj
	end
	local newFunc = {} --存储该类的变量和函数
	_class[classType] = newFunc
	setmetatable(classType,{__newindex=     --设置__newindex方法,赋值操作的值存在newFunc中
	function(t,k,v) 
		newFunc[k]=v
	end
})

	if super then  -- 如果有父类的话,那么 newFunc 没有的数据从父类当中查找,同时将查找结果缓存 
		setmetatable(newFunc,{__index = function (t,k)
			local ret = _class[super][k]
			newFunc[k] = ret
			return ret
		end})
	end
	return classType
end
local BaseClass = { }
function BaseClass:Ctor(...)
	print("基类,没有任何数据")
end
local Person = Class(BaseClass)
function Person:Ctor( name,age )
	self.name = name
	self.age = age
end
function Person:Info()
	print("我的名字",self.name,"年龄",self.age)
end
local me = Person.New("小明",12)
me:Info()

结果如下图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值