面向對象的lua

使用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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章