欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

這里提供 Lua 中實現(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()  -- 定義一個基類 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() -- 定義一個成員函數(shù) base_type:print_x
 print(self.x)
end
 
function base_type:hello() -- 定義另一個成員函數(shù) base_type:hello
 print("hello base_type")
end

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

test=class(base_type) -- 定義一個類 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òu)造了。
a:print_x() -- 輸出 1 ,這個是基類 base_type 中的成員函數(shù)。
a:hello() -- 輸出 hello test ,這個函數(shù)被重載了。

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

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

base_type=class()       -- 定義一個基類 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()    -- 定義一個成員函數(shù) base_type:print_x
    print(self.x)
end

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


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

下面看看怎樣繼承: test=class(basetype) -- 定義一個類 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òu)造了。
a:print_x() -- 輸出 1 ,這個是基類 base_type 中的成員函數(shù)。
a:hello()   -- 輸出 hello test ,這個函數(shù)被重載了。

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

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

相關(guān)文章

  • Lua學(xué)習(xí)筆記之函數(shù)、變長參數(shù)、closure(閉包)、select等

    Lua學(xué)習(xí)筆記之函數(shù)、變長參數(shù)、closure(閉包)、select等

    這篇文章主要介紹了Lua學(xué)習(xí)筆記之函數(shù)、變長參數(shù)、closure(閉包)、select等,本文著重講解了這些特性的用法,并給出代碼實例,需要的朋友可以參考下
    2015-04-04
  • 淺談Lua語句

    淺談Lua語句

    Lua支持大多數(shù)傳統(tǒng)的語句,跟C語言和Pascal差不多。傳統(tǒng)的語句包括:賦值,控制結(jié)構(gòu),流程調(diào)用等。Lua還支持一些不太傳統(tǒng)的語句,例如多賦值(聽起來有點怪,往下看就明白了)和局部變量聲明(這個好像也是傳統(tǒng)的吧)。
    2015-05-05
  • Lua教程(五):迭代器和泛型for

    Lua教程(五):迭代器和泛型for

    這篇文章主要介紹了Lua教程(五):迭代器和泛型for,本文講解了迭代器與Closure、泛型for的語義、 無狀態(tài)迭代器的例子、 具有復(fù)雜狀態(tài)的迭代器等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua教程(十九):C調(diào)用Lua

    Lua教程(十九):C調(diào)用Lua

    這篇文章主要介紹了Lua教程(十九):C調(diào)用Lua,本文講解了C調(diào)用Lua基礎(chǔ)知識、table操作、調(diào)用Lua函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 使用Lua作為C語言項目的配置文件實例

    使用Lua作為C語言項目的配置文件實例

    這篇文章主要介紹了使用Lua作為C語言項目的配置文件實例,本文用Lua創(chuàng)建了一個配置文件,然后在C言語中解析它,需要的朋友可以參考下
    2015-04-04
  • Lua腳本調(diào)用外部腳本

    Lua腳本調(diào)用外部腳本

    在游戲腳本開發(fā)中,我們往往會發(fā)現(xiàn)腳本量非常大,而且我們經(jīng)常會在一些核心腳本文件中定義常用的功能函數(shù),但是Lua腳本沒有提供include關(guān)鍵詞,那又是怎樣調(diào)用外部函數(shù)的呢?如何實現(xiàn)腳本的Include功能?
    2014-09-09
  • 舉例說明Lua中元表和元方法的使用

    舉例說明Lua中元表和元方法的使用

    這篇文章主要介紹了舉例說明Lua中元表和元方法的使用,文中--兩個橫線開始單行的注釋,--[[加上兩個[和]表示多行的注釋--]],需要的朋友可以參考下
    2015-07-07
  • Lua讀取和寫入文件處理例子

    Lua讀取和寫入文件處理例子

    這篇文章主要介紹了Lua讀取和寫入文件處理,本文直接給出實例代碼,需要的朋友可以參考下
    2014-11-11
  • Lua教程(十): 全局變量和非全局的環(huán)境

    Lua教程(十): 全局變量和非全局的環(huán)境

    這篇文章主要介紹了Lua教程(十): 全局變量和非全局的環(huán)境,本文講解了老的全局變量環(huán)境和Lua5中新的非全局環(huán)境相關(guān)知識,需要的朋友可以參考下
    2015-04-04
  • 在Lua中使用模塊的基礎(chǔ)教程

    在Lua中使用模塊的基礎(chǔ)教程

    這篇文章主要介紹了在Lua中模塊的基本使用方法,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論