Lua中實現物件導向的一種漂亮解決方案

2022-09-21 02:30:10 字數 2867 閱讀 2011

在 pil 中,lua 的作者推薦了一種方案來實現 oo,比較簡潔,但是我依然覺得有些繁瑣。

這裡給出一種更漂亮一點的解決方案,見下文:

這裡提供 lua 中實現 oo 的一種方案:

複製** **如下:

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,...)

endif c.ctor then

c.ctor(obj,...)

endend

create(class_type,...)

endsetmetatable(obj,)

return obj

endlocal vtbl={}

_class[class_type]=vtbl

setmetatable(class_type,)

if super then

setmetatable(vtbl,)

endreturn class_type

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

base_type=class()  -- 定義乙個基類 base_type

複製** **如下:

function base_type:ctor(x) -- 定義 base_type 的建構函式

print("base_type ctor")

self.x=x

end 

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

print(self.x)

end 

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

pr"hello base_type")

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

下面看看怎樣繼承:

複製** **如下:

test=class(base_typewww.cppcns.com) -- 定義乙個類 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(super) ,用這個函式,我們就可以方便的在 lua 中定義類:

複製** **如下:

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(basetype) -- 定義乙個類 test 繼承於 basetype

複製** **如下:

function test:ctor()    -- 定義 test 的建構函式

print("test ctor")

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

&nbaclixdsp; print("hello test")

end現在可以試一下了:

複製** **如下:

a=test.new(1)   -- 輸出兩行,base_type ctor 和 test ctor 。這個物件被正確的構造了。

a:print_x() -- 輸出 1 ,這個是基程式設計客棧類 base_type 中的成員函式。

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

其實,實現多重繼承也並不複雜,這裡就不再展開了。更有意義的擴充套件可能是增加乙個 dtor :)

ps. 這裡用了點小技巧,將 self 繫結到 closure 上,所以並不使用 a:hello 而是直接用 a.hello 呼叫成員函式。這個技巧並不非常有用,從效率角度上說,還是不用為好。

本文標題: lua中實現物件導向的一種漂亮解決方案

本文位址:

Lua 實現switch的一種方案

local et case one 1 local et case two 2 local function do case one print do case one endlocal function do case two print do case two endlocal function...

lua中的物件導向

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

解說Lua中的物件導向

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