在 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中的物件導向 複製表方式物件導向 引數為一張...