關於雲風在 Lua 中實現物件導向的原始碼分析

2021-07-30 07:16:18 字數 2536 閱讀 8717

①原始碼:

local _class=

function class(super)

local class_type=

class_type.ctor=

false

class_type.super=super

class_type.new=

function

(...

)local obj=

dolocal create

create =

function

(c,...

)if c.super then

create(c.super,...

)end

if c.ctor then

c.ctor(obj,...

)end

end 

create(class_type,...

)end

setmetatable

(obj,

)return obj

endlocal vtbl=

_class[class_type]

=vtbl

setmetatable

(class_type,

)if super then

setmetatable

(vtbl,

)end

return class_type

end

②使用示例:

現在,我們來看看怎麼使用:

base_type=class(

)-- 定義乙個基類 base_type

function base_type:ctor(x)

-- 定義 base_type 的建構函式

print

("base_type ctor"

) self.x=x

endfunction base_type:print_x(

)-- 定義乙個成員函式 base_type:print_x

print

(self.x)

endfunction base_type:hello(

)-- 定義另乙個成員函式 base_type:hello

print

("hello base_type"

)end

以上是基本的 class 定義的語法,完全相容 lua 的程式設計習慣。我增加了乙個叫做 ctor 的詞,作為建構函式的名字。

下面看看怎樣繼承:

test=class(base_type)

-- 定義乙個類 test 繼承於 base_type

function test:ctor(

)-- 定義 test 的建構函式

print

("test ctor"

)end

function test:hello(

)-- 過載 base_type:hello 為 test:hello

print

("hello test"

)end

現在可以試一下了:

a=test.new(1)

-- 輸出兩行,base_type ctor 和 test ctor 。這個物件被正確的構造了。

a:print_x(

)-- 輸出 1 ,這個是基類 base_type 中的成員函式。

a:hello(

)-- 輸出 hello test ,這個函式被過載了。

③原理分析

① 通過引入_class來索引各個類(

class_type

)的對應的

vtbl

(裡面記錄了該類的成員變數和成員方法,通過

__newindex

原方法來實現,攔截對

class_type

元素的直接賦值轉而儲存在對應的

vtbl

表中);

② 允許使用者通過重寫class_type的

ctor

函式來自定義構造過程(主要用於實現成員變數的定義),開放唯一乙個例項化函式來讓使用者生成物件例項(該函式的主要任務是遞迴呼叫上層類的

ctor

函式,並把要返回的物件例項的

__index

設定為該

class_type

對應的vtbl

)。所以

class_type

在整個過程中只是只是實現了把物件例項跟

vtbl

表繫結的任務;

③ 最後,如果該類有父類,就把它的vtbl的

__index

元方法設定為父類的

__index

。那麼最後呈現出來的結果就是物件例項的

__index

指向該類對應的

vtbl

,然後它再指向更上層父類對應的

vtbl

。任何對類的賦值都被

__newindex

攔截,從而轉為向對應的

vtbl

賦值。

lua中的物件導向

lua中是通過元表來物件導向的,下面就lua物件導向做一下說明 local account function account new o 這裡是冒號哦 o o or 如果使用者沒有提供table,則建立乙個 setmetatable o,self self.index self return o e...

Lua中「 」以及 物件導向

閱讀本文需要理解前一篇文章lua中的元方法 當通過 呼叫時,系統會自動傳遞當前的table給self,例如a.eat a 相當於a eat 傳遞當前物件給eat方法,這樣就提高了table的方法的擴充套件性了。本質是使用table進行模擬 定義空表,相當於是乙個類 person 定義區域性表引用變數...

解說Lua中的物件導向

物件導向不是針對某一門語言,而是一種思想,在面向過程的語言也可以使用物件導向的思想來進行程式設計。在lua中,並沒有物件導向的概念存在,沒有類的定義和子類的定義,但同樣在lua中可以利用物件導向的思想來實現物件導向的類繼承。一 複製表的方式物件導向 lua中的物件導向 複製表方式物件導向 引數為一張...