最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua中實現面向對象的一種漂亮解決方案

 更新時間:2015年01月12日 08:54:02   投稿:junjie  
這篇文章主要介紹了Lua中實現面向對象的一種漂亮解決方案,本文給出實現代碼、使用方法及代碼分析,需要的朋友可以參考下

在 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={}
   do
    local 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,{ __index=_class[class_type] })
   return obj
  end
 local vtbl={}
 _class[class_type]=vtbl
 
 setmetatable(class_type,{__newindex=
  function(t,k,v)
   vtbl[k]=v
  end
 })
 
 if super then
  setmetatable(vtbl,{__index=
   function(t,k)
    local ret=_class[super][k]
    vtbl[k]=ret
    return ret
   end
  })
 end
 
 return 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
 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(super) ,用這個函數,我們就可以方便的在 lua 中定義類:

復制代碼 代碼如下:

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
    print("hello base_type")
end


以上是基本的 class 定義的語法,完全兼容 lua 的編程習慣。我增加了一個叫做 ctor 的詞,作為構造函數的名字。

下面看看怎樣繼承: test=class(basetype) -- 定義一個類 test 繼承于 basetype

復制代碼 代碼如下:

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 ,這個函數被重載了。

其實,實現多重繼承也并不復雜,這里就不再展開了。更有意義的擴展可能是增加一個 dtor :)

ps. 這里用了點小技巧,將 self 綁定到 closure 上,所以并不使用 a:hello 而是直接用 a.hello 調用成員函數。這個技巧并不非常有用,從效率角度上說,還是不用為好。

相關文章

  • Lua中類的實現原理探討(Lua中實現類的方法)

    Lua中類的實現原理探討(Lua中實現類的方法)

    這篇文章主要介紹了Lua中類的實現原理探討(Lua中實現類的方法),本文同時講解了metatable、元方法等內容,需要的朋友可以參考下
    2014-10-10
  • Lua教程(五):C/C++操作Lua數組和字符串示例

    Lua教程(五):C/C++操作Lua數組和字符串示例

    這篇文章主要介紹了Lua教程(五):C/C++操作Lua數組和字符串示例,本文同時還講解了如何在C/C++函數里面存儲Lua狀態(tài),需要的朋友可以參考下
    2014-09-09
  • Lua select函數用法實例

    Lua select函數用法實例

    這篇文章主要介紹了Lua select函數用法實例,本文直接給出代碼實例,并講解了select函數的使用技巧,需要的朋友可以參考下
    2015-04-04
  • Lua中獲取table長度問題探討

    Lua中獲取table長度問題探討

    這篇文章主要介紹了Lua中獲取table長度問題探討,本文非常深入的研究了Lua中table長度的獲取問題,分析了各種各樣的情況,需要的朋友可以參考下
    2015-04-04
  • Linux下編寫Lua擴展so文件和調用方法實例

    Linux下編寫Lua擴展so文件和調用方法實例

    這篇文章主要介紹了Linux下編寫Lua擴展so文件和調用方法實例,本文給出C語言代碼、編譯SO文件、Lua中調用代碼實例,需要的朋友可以參考下
    2015-05-05
  • Lua在windows下的安裝及環(huán)境配置

    Lua在windows下的安裝及環(huán)境配置

    這篇文章主要介紹了Lua在windows下的安裝及環(huán)境配置,本文使用lua for windows整體環(huán)境,lua for windows其實是一整套Lua的開發(fā)環(huán)境,需要的朋友可以參考下
    2015-07-07
  • Lua中的函數代碼實例

    Lua中的函數代碼實例

    這篇文章主要介紹了Lua中的函數代碼實例,本文著重講解函數的寫法以及一些小知識,需要的朋友可以參考下
    2015-04-04
  • Lua實現類繼承

    Lua實現類繼承

    這里給大家演示的是一個使用lua實現類繼承的示例,實現類繼承其實有很多種寫法,這里是本人常用的方法,推薦給大家。
    2015-03-03
  • Lua函數用法研究

    Lua函數用法研究

    這篇文章主要介紹了Lua函數用法研究,本文講解了函數、變量的用法、返回多個結果值和可變參數等特性的示例,需要的朋友可以參考下
    2015-07-07
  • Lua中模塊以及實現方法指南

    Lua中模塊以及實現方法指南

    從Lua 5.1開始,我們可以使用require和module函數來獲取和創(chuàng)建Lua中的模塊。從使用者的角度來看,一個模塊就是一個程序庫,可以通過require來加載,之后便得到一個類型為table的全局變量。
    2015-04-04

最新評論

阳东县| 滦平县| 阿城市| 黄陵县| 岱山县| 连山| 陇川县| 和林格尔县| 民权县| 琼结县| 台东县| 开平市| 木里| 仪陇县| 道孚县| 三穗县| 增城市| 神农架林区| 乌鲁木齐市| 绿春县| 宜黄县| 廊坊市| 永年县| 高密市| 翁牛特旗| 拉萨市| 伽师县| 托里县| 北票市| 夏津县| 上杭县| 镇雄县| 舞钢市| 和田县| 长治县| 垣曲县| 霸州市| 谢通门县| 延长县| 伊吾县| 随州市|