--[[
创建一个类的方法
原理:
一个类,本质上也是一个table,只是他包含了__index键,而且__index键指向它本身。
创建一个类的对象,即新建一个table,并且将类(一个table)设置为其metatable。
参数:
name->类名(string类型值,必需)
super->父类列表(table类型值或nil,非必需)
]]
function class(name, super)
-- name必须是一个string
if not name or type(name) ~= "string" then
error("Name of class should be a string value.")
end
-- super如果有,必须是一个table,使用多继承的形式
if not super then
super = {}
else
if type(super) ~= "table" then
error("Super of class should be a table value.")
end
end
-- 生成一个多继承的类
local myClass = {}
myClass._className = name -- 保存ClassName
myClass._super = super -- 保存父类列表
myClass.__index = myClass
setmetatable(myClass, {__index = function(tab, key) -- 元表的__index是从super列表中查找key
for k,v in pairs(myClass._super) do
if v[key] then
return v[key]
end
end
end})
-- new函数
function myClass:new()
local obj = {}
setmetatable(obj, myClass)
return obj
end
-- release函数,只是想写个release,感觉没什么意义
function myClass:release()
myClass = nil
end
-- 获取类型,只是因为保存了className,所以加了个函数,并没有觉得有什么意义
function myClass:getClass()
return myClass._className
end
-- 获取父类列表,同上只是因为保存了super列表
function myClass:getSuper()
return myClass._super
end
return myClass
end
-- 下面是测试代码
-- 新建一个普通的类,不需要再手动写new方法了
Person = class("Person") -- 没有父类
function Person:say()
print("Person say")
end
-- 继承一个类
Worker = class("Worker", {Person}) -- 父类是Person
function Worker:work()
print("Worker work")
end
-- 多继承呢
Coder = class("Coder", {Person, Worker}) -- 父类是Person和Worker
function Coder:coding()
print("Coder coding")
end
-- 创建一个Coder类的对象
local me = Coder:new()
me:say() -- Person的say,虽然Worker也有say,但是父类列表中Person在前,在__index中是先找Person类
me:work() -- Worker的work
me:coding() -- Coder的coding
print(me:getClass())
print(#me:getSuper())
me:release()
(Lua中的类 - 4)封装一个生成类的函数
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...