讓lua物件導向--lua和android

來源:互聯網
上載者:User

標籤:

讓lua物件導向

lua本身不支援物件導向的特性,但是由於lua是基於原型(prototype)的語言,要實現物件導向的特性也是有一定的方法的,實現方式有很多種, 總結了一下我最近對使用lua實現物件導向的特性,主要可以分為以下兩種不同的方式來實現:

  1、使用metatable的__index域實現,實現的時候需要利用的lua語言的一些特性才可以實現,主要有:

  a、將table b作為table a的一個prototype的方法:setmetatable(a, {__index = b});

  b、lua5.1中實現的module機制;

  通過這兩個技術你可以實現一個基礎類,實作類別的inherit和new方法:

  -----------------------------------------------------------------------   --filename:"obj.lua"   local setmetatable = setmetatable   module"obj"   function inherit (self)   return function (newclass)   setmetatable (newclass, self)   self.__index = self   return newclass   end   end   function new (self, o)   o = o or {}   setmetatable (o, self)   self.__index = self   return o   end   ----------------------------------------------------------------------   --Now you can define a new class which extends the previous `obj‘:   --filename:"myobj.lua"   local obj = require"obj"   module ("myobj", obj:inherit())   --Class `myobj‘ will "inherit" the methods `new‘ and `inherit‘ from class `obj‘.

  優點:

  1、由於子類的很多資料和方法都是共用了父類的,用到父類的資料和方法的時候,只是在使用的時候才直接調用父類的方法和資料,這樣可以減少程式記憶體的消耗,更主要的是,父類在運行期的修改是會影響到子類的;

  2、充分利用了lua語言的特性,父類的方法和資料的訪問是解析器來做的,所以效率上的開銷還是比較小的;

  缺點:

  1、如果父類中有一個資料是一個引用的時候(如table)的時候,就會出現在一個子類中操作這個table會改變其他子類的情況,造資料的不一致,所以應該盡量避免這種類的建立,如果有這樣的需求的話,就需要對inherit和new函數進行一些特殊的操作,簡單來說就是加一個init函數,將所有這類的資料都顯示的建立一下。

  2、由於每次取操作都需要在metatable中取,所以,每次就會增加一層繼承,就增加一個函數調用的開銷,雖然是由解析器來做的,但是如果層次多了的話,還是有開銷的;

  2、使用table拷貝的方式實現,實現的時候利用的lua的技術為:

  a、使用lua實現一個table拷貝的函數;

  b、lua5.1中實現的module機制;

  通過這兩個技術你可以實現一個基礎類,實作類別的inherit和new方法:

  -----------------------------------------------------------------------   --filename:"obj.lua"   local setmetatable = setmetatable   module"obj"   function inherit (self)   return function (newclass)   newclass = table.clone(self)   return newclass   end   end   function new (self, o)   o = o or {}   o = table.clone(self)   return o   end   ----------------------------------------------------------------------   --Now you can define a new class which extends the previous `obj‘:   --filename:"myobj.lua"   local obj = require"obj"   module ("myobj", obj:inherit())   --Class `myobj‘ will "inherit" the methods `new‘ and `inherit‘ from class `obj‘.

  優點:

  1、父類中的資料是全部拷貝到子類中的,所以,不存在資料不一致的情況;

  2、所有的函數調用和資料調用都是直接調用每個執行個體的,不需要到父類中尋找;

  缺點:

  1、全部資料的copy,在建立的時候就會增加一個table copy的過程,影響效率;

  2、全部資料和方法都是在建立的時候拷貝一份的,會增加很多的記憶體消耗,而且如果在運行期改變了父類,並不能改變子類;

  總結:

  結合這兩種方式的有缺點,從一個物件導向的角度來說,第一種方式更加適合實現物件導向的特性,第二種方式對物件導向的類比就牽強一些(缺點2),但是從使用的角度來說,因為在訪問資料和方法速度上,第二種方式還是有優勢的,所以,在具體的使用的時候,可以靈活一下使用,將兩者結合一下。

  比如說,對於用戶端這邊來說,類在開始建立好了以後就一般不需要修改了,而且子類一般都是需要父類的所有的方法和資料的,所有我們就可以使用第二種方式,而產生對象執行個體的時候,對象的執行個體一般都不會調用類的所有的方法,而且用完了這個執行個體,就會銷毀的,所以,我們這裡就可以採用第一種方式,結合一下設計可以是:

  -----------------------------------------------------------------------   --filename:"obj.lua"   local setmetatable = setmetatable   module"obj"   function inherit (self)   return function (newclass)   newclass = table.clone(self)   return newclass   end   end   function new (self, o)   o = o or {}   setmetatable (o, self)   self.__index = self   return o   end   ----------------------------------------------------------------------   --Now you can define a new class which extends the previous `obj‘:   --filename:"myobj.lua"   local obj = require"obj"   module ("myobj", obj:inherit())   --Class `myobj‘ will "inherit" the methods `new‘ and `inherit‘ from class `obj‘.

讓lua物件導向--lua和android

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.