lua中實現繼承

2021-08-14 06:58:21 字數 2300 閱讀 4692

什麼是元表

元表像是乙個「操作指南」,裡面包含了一系列操作的解決方案,例如__index方法就是定義了這個表在索引失敗的情況下該怎麼辦。

__index元方法

很多人對此都有誤解,這個誤解是:如果a的元表是b,那麼如果訪問了乙個a中不存在的成員,就會訪問查詢b中有沒有這個成員。而這個理解是完全錯誤的,實際上,即使將a的元表設定為b,而且b中也確實有這個成員,返回結果仍然會是nil,原因就是b的__index元方法沒有賦值。別忘了我們之前說過的:「元表是乙個操作指南」,定義了元表,只是有了操作指南,但不應該在操作指南裡面去查詢元素。

示例

father = 

son =

setmetable(son,father)

print(son.house) --nil

修改**如下:

father = 

father.__index = father --把father的__index方法指向自己

son =

setmetable(son,father)

print(son.house) --1

在上述例子中,訪問son.house時,son中沒有house這個成員,但lua接著發現son有元表father,注意:此時,lua並不是直接在father中找名為house的成員,而是呼叫father的__index方法,如果__index方法為nil,則返回nil,如果是乙個表(上例中father的__index方法等於自己,就是這種情況),那麼就到__index方法所指的這個表中查詢名為house的成員,於是,最終找到了house成員。

注:__index方法除了可以是乙個表,還可以是乙個函式,如果是乙個函式,__index方法被呼叫時將返回該函式的返回值。

總結一下lua查詢乙個表元素時的規則,其實就是如下3個步驟:

參考**:lua查詢表元素過程(元表、__index方法是如何工作的)

定義類

--宣告,這裡宣告了類名還有屬性,並且給出了屬性的初始值。

class =

--這句是重定義元表的索引,就是說有了這句,這個才是乙個類。具體的解釋,請參照上面

class.__index = class

--構造體

function

class:new

(x,y)

local self = {} --初始化self,如果沒有這句,那麼類所建立的物件改變,其他物件都會改變

setmetatable(self, class) --將self的元表設定為class

self.x = x --屬性值初始化

self.y = y

return self --返回自身

end--這裡定義類的其他方法

function

class:test

() print(self.x,self.y)

end

繼承

--宣告了新的屬性z  

main =

--設定型別是class

setmetatable(main, class)

--還是和類定義一樣,表索引設定為自身

main.__index = main

--這裡是構造體

function

main:new

(x,y,z)

local self = {} --初始化物件自身

self = class:new(x,y) --將物件自身設定為父類,這個語句相當於其他語言的super

setmetatable(self, main) --將物件自身元表設定為main類

self.z= z --新的屬性初始化,如果沒有將會按照宣告=0

return self

end--定義乙個新的方法

function

main:go

()

self.x = self.x + 10

end--重定義父類的方法

function

main:test

()

print(self.x,self.y,self.z)

end

參考**lua的類實現繼承

lua實現繼承

lua本身沒有像c 一樣的繼承功能 但是我們可以自己實現乙個類似c 的繼承功能 書本也有詳細介紹,不過讀起來確實費解,所以本人自己寫了乙個簡單的繼承,一目了然,用來學習很容易入手 完整 基類 people function people new o o o or setmetatable o,sel...

lua實現類的繼承

local class function class super local class type class type.ctor false class type.super super class type.new function local obj do 遞迴呼叫建構函式,實現構造基類的資料...

lua實現偽多型繼承

通過lua的設定元表 index欄位,巧妙的運用在無法索引到物件的key時會呼叫 index的機制,實現了偽多型 繼承。如下 inheritance classtotaltable function inheritance class father local classvo classvo.con...