既然是面向对象,需要有
- 需要有构造函数 ctor
- 能够继承父类
- 有 创建对象的方法 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()
结果如下图