婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Lua中實現面向對象的一種漂亮解決方案

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面向對象編程學習筆記
  • Lua模擬面向對象示例分享

標簽:儋州 臺灣 德宏 天門 宣城 金昌 天門 濰坊

巨人網絡通訊聲明:本文標題《Lua中實現面向對象的一種漂亮解決方案》,本文關鍵詞  Lua,中,實現,面向,對象,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua中實現面向對象的一種漂亮解決方案》相關的同類信息!
  • 本頁收集關于Lua中實現面向對象的一種漂亮解決方案的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 兴化市| 翁牛特旗| 长宁县| 桂阳县| 德清县| 柳江县| 新宾| 通渭县| 依兰县| 梅州市| 南丹县| 汕尾市| 改则县| 阳城县| 卢湾区| 天峻县| 中江县| 巢湖市| 佛学| 邛崃市| 望江县| 乡城县| 碌曲县| 青浦区| 邓州市| 福建省| 大丰市| 隆化县| 泰顺县| 孝义市| 竹北市| 女性| 湖北省| 虹口区| 嵩明县| 汾西县| 阜平县| 客服| 博爱县| 手机| 体育|