Lua面向对象作为游戏面试时的高频考试题,属于必须会的知识点。以下内容提供了一个完整的类的创建模板。包括继承,函数重载,构造函数以及类的实例化。
- 基类模板的创建,新建一个BassClass.lua存放下面内容。以后每定义一个新的类,这个脚本都不用更改
local _class = {}
local function Init(obj, ...)
local create
create = function(classtype, ...)
if classtype.supper then
create(classtype.supper, ...)
end
if classtype.__init then
classtype.__init(obj, ...)
end
end
create(obj._class_type, ...)
end
local function New(classtype,...)
local obj = {}
obj._class_type = classtype
setmetatable(obj,{__index = _class[classtype]})
_class[classtype]:Func()
Init(obj,...)
return obj
end
function BaseClass(classname,supperclass)
local class_type = {}
class_type.__init = false
class_type.__cname = classname
class_type.supper = supperclass
class_type.New = function(...)
return New(class_type, ...)
end
local vtbl = {}
_class[class_type] = vtbl
setmetatable(class_type, {
__newindex = function(table, key, value)
vtbl[key] = value
end,
__index = vtbl
})
if supperclass then
setmetatable(vtbl, {
__index = function(table, key)
return _class[supperclass][key]
end
})
end
return class_type
end
- 新类的定义。下面定义了class1和class2。
__init是构造函数,Func是class1独有的方法。
只需要一行代码就能表示class2继承自class1,非常方便。
require("BaseClass")
local class1 = BaseClass("Class1")
local function class1Init(self)
print("class1Init")
end
local function Func(self)
print("class1Func")
end
class1.__init = class1Init
class1.Func = Func
local class2 = BaseClass("Class2",class1)
local function class2Init(self)
print("class2Init")
end
class2.__init = class2Init
- 类的实例化
-- result:
-- class1Init
-- class2Init
local class2Instance = class2.New()
-- result
-- class1Func
class2Instance:Func()
- 构造class2的调用流程
-
_class、classtype和new出来的实例之间的关系
image
网友评论