①原始碼:
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 的建構函式
("base_type ctor"
) self.x=x
endfunction base_type:print_x(
)-- 定義乙個成員函式 base_type:print_x
(self.x)
endfunction base_type:hello(
)-- 定義另乙個成員函式 base_type:hello
("hello base_type"
)end
以上是基本的 class 定義的語法,完全相容 lua 的程式設計習慣。我增加了乙個叫做 ctor 的詞,作為建構函式的名字。
下面看看怎樣繼承:
test=class(base_type)-- 定義乙個類 test 繼承於 base_type
function test:ctor(
)-- 定義 test 的建構函式
("test ctor"
)end
function test:hello(
)-- 過載 base_type:hello 為 test:hello
("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中的物件導向 複製表方式物件導向 引數為一張...