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

Lua中實(shí)現(xiàn)面向?qū)ο蟮囊环N漂亮解決方案

 更新時(shí)間:2015年01月12日 08:54:02   投稿:junjie  
這篇文章主要介紹了Lua中實(shí)現(xiàn)面向?qū)ο蟮囊环N漂亮解決方案,本文給出實(shí)現(xiàn)代碼、使用方法及代碼分析,需要的朋友可以參考下

在 pil 中,lua 的作者推薦了一種方案來實(shí)現(xiàn) OO,比較簡潔,但是我依然覺得有些繁瑣。

這里給出一種更漂亮一點(diǎn)的解決方案,見下文:

這里提供 Lua 中實(shí)現(xiàn) OO 的一種方案:

復(fù)制代碼 代碼如下:

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

現(xiàn)在,我們來看看怎么使用:
base_type=class()  -- 定義一個(gè)基類 base_type

復(fù)制代碼 代碼如下:

function base_type:ctor(x) -- 定義 base_type 的構(gòu)造函數(shù)
 print("base_type ctor")
 self.x=x
end
 
function base_type:print_x() -- 定義一個(gè)成員函數(shù) base_type:print_x
 print(self.x)
end
 
function base_type:hello() -- 定義另一個(gè)成員函數(shù) base_type:hello
 print("hello base_type")
end

以上是基本的 class 定義的語法,完全兼容 lua 的編程習(xí)慣。我增加了一個(gè)叫做 ctor 的詞,作為構(gòu)造函數(shù)的名字。
下面看看怎樣繼承:
復(fù)制代碼 代碼如下:

test=class(base_type) -- 定義一個(gè)類 test 繼承于 base_type
 
function test:ctor() -- 定義 test 的構(gòu)造函數(shù)
 print("test ctor")
end
 
function test:hello() -- 重載 base_type:hello 為 test:hello
 print("hello test")
end

現(xiàn)在可以試一下了:
復(fù)制代碼 代碼如下:

a=test.new(1) -- 輸出兩行,base_type ctor 和 test ctor 。這個(gè)對象被正確的構(gòu)造了。
a:print_x() -- 輸出 1 ,這個(gè)是基類 base_type 中的成員函數(shù)。
a:hello() -- 輸出 hello test ,這個(gè)函數(shù)被重載了。

在這個(gè)方案中,只定義了一個(gè)函數(shù) class(super) ,用這個(gè)函數(shù),我們就可以方便的在 lua 中定義類:

復(fù)制代碼 代碼如下:

base_type=class()       -- 定義一個(gè)基類 base_type

function base_type:ctor(x)  -- 定義 base_type 的構(gòu)造函數(shù)
    print("base_type ctor")
    self.x=x
end

function base_type:print_x()    -- 定義一個(gè)成員函數(shù) base_type:print_x
    print(self.x)
end

function base_type:hello()  -- 定義另一個(gè)成員函數(shù) base_type:hello
    print("hello base_type")
end


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

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

復(fù)制代碼 代碼如下:

function test:ctor()    -- 定義 test 的構(gòu)造函數(shù)
    print("test ctor")
end

function test:hello()   -- 重載 base_type:hello 為 test:hello
    print("hello test")
end


現(xiàn)在可以試一下了:
復(fù)制代碼 代碼如下:

a=test.new(1)   -- 輸出兩行,base_type ctor 和 test ctor 。這個(gè)對象被正確的構(gòu)造了。
a:print_x() -- 輸出 1 ,這個(gè)是基類 base_type 中的成員函數(shù)。
a:hello()   -- 輸出 hello test ,這個(gè)函數(shù)被重載了。

其實(shí),實(shí)現(xiàn)多重繼承也并不復(fù)雜,這里就不再展開了。更有意義的擴(kuò)展可能是增加一個(gè) dtor :)

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

相關(guān)文章

  • Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法)

    Lua中類的實(shí)現(xiàn)原理探討(Lua中實(shí)現(xiàn)類的方法)

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

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

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

    Lua select函數(shù)用法實(shí)例

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

    Lua中獲取table長度問題探討

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

    Linux下編寫Lua擴(kuò)展so文件和調(diào)用方法實(shí)例

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

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

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

    Lua中的函數(shù)代碼實(shí)例

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

    Lua實(shí)現(xiàn)類繼承

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

    Lua函數(shù)用法研究

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

    Lua中模塊以及實(shí)現(xiàn)方法指南

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

最新評論

大田县| 双桥区| 河北区| 呼伦贝尔市| 年辖:市辖区| 沾益县| 宣城市| 昭苏县| 云南省| 丹棱县| 抚宁县| 泽普县| 通海县| 吐鲁番市| 乡宁县| 磐安县| 巴东县| 米泉市| 四子王旗| 炎陵县| 永福县| 金堂县| 永康市| 井冈山市| 贡嘎县| 沂南县| 察隅县| 抚远县| 拜泉县| 西乌珠穆沁旗| 资阳市| 广州市| 台山市| 资中县| 眉山市| 郁南县| 怀化市| 东阿县| 阿拉善左旗| 阳信县| 冀州市|