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出來的實例之間的關係