使用lua很久了,對於如何面向對象使用lua還是想說些什麼。
1. 首先我想說的是lua不適合面向對象,或者說他的基因不是爲面向對象設計的。
2. lua可以使用面向對象,作爲lua的一個特性可以爲我們帶來很多驚喜。
如何面向對象:元表
PS:不知道元表的同學請去補習基礎知識
例如
Constructer = {}
Constructer.__index = function(_, key)
print("I am you father")
end
BaseModel = {}
function BaseModel.new()
setmetatable(cls, Constructer)
cls.__index = cls
return cls
end
又例如
Base = {}
function Base:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
SpaceBace = Base:new()
local instance = SpaceBace:new()
SpaceBase繼承了Base的new方法,再次執行new的時候self不是Base而是SpaceBase,同樣__index也是SpaceBase,因此instance的原表是SpaceBase,SpaceBase的原表是Base。即instance繼承SpaceBase,SpaceBase繼承Base。
多重繼承
之前我們將原表設置爲父類,可以實現繼承,那麼多重繼承其實只需要將原表的__index設置爲一個查找函數就可以了
local function search(k, list)
for i=1,#list do
local v = list[i][k]
if v then return v end
end
end
function createClass( ... )
local o = {}
local parents = { ... }
setmetatable(o, {__index = function(t,k)
return search(k, parents)
end})
o.__index = o
end
想面向對象,搞吧。另外 提下raw get rawset:無視自定義的__index, __newindex的get set。